Executable path is not absolute, ignoring: xxx

在Linux服务器上部署应用程序时遇到服务启动错误,原因是ExecStart指令中使用了相对路径。根据博客内容,解决方案是将ExecStart改为绝对路径,如使用/usr/bin/env指定Python解释器的路径。博主分享了遇到相同问题并解决的经验,适用于Python和Java应用。
部署运行你感兴趣的模型镜像

最近在Linux服务器上面部署我写的应用程序,使用的是虚拟环境。

具体Linux服务代码如下:

[Unit]
Description=Process Redis data on the SMS_Receive website.
After=network.target
[Service]
User=ubuntu
Group=www-data
Environment="PATH=/var/SMS_Receive/venv/bin/"
WorkingDirectory=/var/SMS_Receive_Service
ExecStart=python Anti_Web_Scraping.py
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target

运行服务之后报如下错误:

[/etc/systemd/system/SMS_Receive_Redis.service:9] Executable path is not absolute, ignoring: python Anti_Web_Scraping

具体截图如下:

之后参考了这个页面:

Your service definitions are like this:

[Service]
ExecStart=python /home/pi/projects/script1.py
Restart=always

And this is the error message on each of them:

Executable path is not absolute, ignoring: python /home/pi/...

For systemd, the "executable" in this service definition is python, and that is clearly not an absolute path. The /home/pi/projects/script1.py is just an argument to this python executable, and caring about its proper form is the executable's job.

Any Python-specific environment variables like PYTHONPATH have no meaning at all for systemd: you must give it an absolute path for the executable in the service definition, each and every time.

Typically, the absolute path to the python interpreter is /usr/bin/python, but you can check:

$ type python
python is /usr/bin/python

So your service definitions should be like this:

[Service]
ExecStart=/usr/bin/python /home/pi/projects/script1.py
Restart=always

页面地址在这里:Using systemd to prevent python scripts from crashing

主要是相对路径的问题,需要修改代码如下:

[Unit]
Description=Process Redis data on the SMS_Receive website.
After=network.target
[Service]
User=ubuntu
Group=www-data
Environment="PATH=/var/SMS_Receive/venv/bin/"
WorkingDirectory=/var/SMS_Receive_Service
ExecStart=/usr/bin/env python Anti_Web_Scraping.py
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target

上面只是加了一个/usr/bin/env 制定了使用用户虚拟环境来解释python脚本。当然也可以加 -p参数:

还可以加上-P参数来指定一些目录去寻找python这个程序, #!/usr/bin/env -S -P/usr/local/bin:/usr/bin -p的作用就是在/usr/local/bin和/usr/bin目录下寻找python。

/usr/bin/env -P ${Environmnet} python Anti_Web_Scraping.py

作者自己遇到的问题与该博主类似,只是我是执行 java -jar命令时遇到的错误。原理是一样的:

原命令:ExecStart=java -agentlib:linux -jar /opt/gsp/gspserver-encrypt.jar

修改后:ExecStart=/usr/bin/java -agentlib:linux -jar /opt/gsp/gspserver-encrypt.jar

欢迎大家私信博主,拉你进技术交流群

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮用户解决Oracle服务启动时的两个错误:一个是`systemctl status oracle.service`报错"invalid argument",另一个是"Executable path is not absolute"。用户提到了引用的内容,需要参考之前的引用信息来整合解决方案。 首先,用户提供的引用[1]提到,环境变量$ORACLE_SID不一致会导致问题。这可能与当前的问题相关,因为如果路径或变量不正确,可能导致服务无法找到正确的实例或可执行文件,从而出现路径问题。因此,我需要检查用户的环境变量设置,尤其是ORACLE_HOME和ORACLE_SID是否与实际安装路径和实例名一致。 引用[2]中的内容是关于find命令的输出重定向,这可能与日志记录有关,但不太直接相关。不过,用户在服务配置中可能需要正确记录日志,以便排查问题,所以可能需要建议用户检查日志文件,使用journalctl来查看详细的错误信息。 引用[3]是一个自启动服务的示例,用户之前可能尝试配置过类似的服务文件,但可能存在路径或参数错误。特别是服务文件中的ExecStart路径是否正确,是否使用了绝对路径,这可能直接导致"Executable path not absolute"的错误。 接下来,我需要结合用户之前的回答,即之前的解决步骤,来进一步分析。之前的回答提到要检查服务文件中的路径、环境变量以及权限问题。现在用户遇到了新的错误,需要更详细地检查这些部分。 对于"invalid argument"错误,通常是因为systemd服务文件中的某些参数不正确。可能的错误点包括:路径中的空格未转义、变量未正确展开、或者路径不存在。例如,如果ORACLE_HOME变量在服务文件中没有被正确引用,或者实际路径与变量值不符,就会导致路径错误。 而"Executable path not absolute"错误明确指出ExecStart中的路径不是绝对路径。这意味着用户可能在服务文件中使用了相对路径或变量,而systemd要求必须使用绝对路径。例如,如果用户写了`$ORACLE_HOME/bin/dbstart`,而$ORACLE_HOME未被正确替换,或者变量未被正确设置,systemd就会报错,因为它无法解析相对路径。 因此,解决方案应该包括以下几个步骤: 1. **验证环境变量**:确保ORACLE_HOME和ORACLE_SID在.bash_profile或.bashrc中正确设置,并且与实际安装路径一致。特别是引用[1]提到的ORACLE_SID不一致的问题,需要检查这一点。 2. **检查服务文件中的路径**:确保ExecStart和ExecStop中的路径是绝对路径,正确使用变量替换。例如,应该写成`$ORACLE_HOME/bin/dbstart`,但需要确认变量是否在服务文件中正确加载。或者,直接使用绝对路径,避免依赖环境变量。 3. **确认服务文件语法**:检查服务文件中的每一部分,如[Service]部分的Type、User、Group是否正确,EnvironmentFile是否指向正确的文件,并且该文件存在且有读取权限。 4. **权限问题**:确保Oracle相关的目录和文件权限正确,特别是dbstart和dbshut脚本是否有可执行权限,以及目录是否属于oracle用户和正确的组。 5. **重新加载systemd配置**:在修改服务文件后,执行systemctl daemon-reload,然后尝试启动服务,查看日志以获取更详细的错误信息。 此外,用户可能需要检查dbstart和dbshut脚本本身是否存在问题,例如脚本是否损坏,或者是否依赖其他环境变量。有时候,手动执行这些脚本可以测试它们是否能正常运行,从而排除服务文件配置的问题。 总结起来,用户的问题可能源于环境变量设置不正确、服务文件中的路径错误或变量未正确展开,以及权限问题。需要逐一排查这些方面,确保每个环节都正确无误。</think>### 解决方案:修复`systemctl`报错"invalid argument"和"Executable path not absolute" --- #### 问题根源定位 1. **环境变量不一致** `$ORACLE_SID`在`.bashrc`中定义为`orcl1`,但实际数据库实例名可能不匹配,导致服务找不到实例[^1]。 2. **路径未使用绝对路径** `ExecStart=$ORACLE_HOME/bin/dbstart`未正确解析环境变量,systemd要求必须使用绝对路径[^2]。 3. **服务文件语法错误** `EnvironmentFile`未正确加载环境变量,或`ORACLE_HOME`变量未被正确引用。 --- #### 分步解决方案 ##### 1. 验证环境变量一致性 ```bash # 以oracle用户登录后检查变量 su - oracle echo "检查关键变量:" echo "ORACLE_HOME: $ORACLE_HOME" echo "ORACLE_SID: $ORACLE_SID" # 对比实际数据库实例名 ps -ef | grep pmon | grep -v grep # 查看实际运行的实例名 ``` **关键点**:若`.bashrc`中`ORACLE_SID=orcl1`但实际实例名为`orcl`,需修改`.bashrc`保持一致性[^1]。 ##### 2. 修正服务文件路径 编辑`/etc/systemd/system/oracle.service`,**强制使用绝对路径**: ```ini [Service] ... # 修改前(错误示例) ExecStart=$ORACLE_HOME/bin/dbstart $ORACLE_HOME # 修改后(正确示例) ExecStart=/opt/oracle/product/11.2.0/dbhome_1/bin/dbstart /opt/oracle/product/11.2.0/dbhome_1 # 直接替换$ORACLE_HOME为实际路径[^2] ``` **注意**:若需保留变量,需通过`EnvironmentFile`显式加载环境变量: ```ini EnvironmentFile=/home/oracle/.bashrc # 确保文件存在且可读 ExecStart=${ORACLE_HOME}/bin/dbstart ${ORACLE_HOME} # 使用${}语法明确变量边界 ``` ##### 3. 修复环境变量加载 ```bash # 确保服务文件加载正确的环境变量文件 grep -E "ORACLE_HOME|ORACLE_SID" /home/oracle/.bashrc # 验证变量定义 # 若变量定义在.bash_profile中,需修改服务文件引用 sed -i 's|EnvironmentFile=.*|EnvironmentFile=/home/oracle/.bash_profile|' /etc/systemd/system/oracle.service ``` ##### 4. 验证脚本权限与路径 ```bash # 检查dbstart脚本是否存在且可执行 ls -l $ORACLE_HOME/bin/dbstart # 输出应为-rwxr-xr-x # 若权限不足,修复权限 chmod 755 $ORACLE_HOME/bin/dbstart chown oracle:oinstall $ORACLE_HOME/bin/dbstart ``` ##### 5. 重载服务并验证 ```bash systemctl daemon-reload systemctl start oracle.service journalctl -u oracle.service -n 30 --no-pager # 检查最新日志 ``` **典型成功日志**: ``` Starting Oracle Database Service... Completed start of Oracle Database instance orcl ``` --- #### 故障排查表 | 错误现象 | 解决方案 | |---------|----------| | `Executable path is not absolute` | 服务文件中所有路径必须使用绝对路径或完整变量展开(如`${ORACLE_HOME}/bin/dbstart`)[^2] | | `invalid argument` | 检查服务文件中是否存在未闭合的引号或特殊符号(如`$`未转义) | | `Failed to connect to Oracle` | 执行`lsnrctl start`手动启动监听器 | --- ### 相关问题 1. 如何在systemd服务中安全地引用用户环境变量? 2. 如何调试Oracle数据库启动时的`ORA-01078`错误? 3. 如何配置多个Oracle实例的systemd服务?
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值