在 Linux 中将 Shell 脚本作为 SystemD 服务运行

在 Linux 中将 Shell 脚本作为 SystemD 服务运行

我尝试运行这些命令

$ nano /usr/bin/script.sh 
$ chmod +x /usr/bin/script.sh
$ cat /lib/systemd/system/shellscript.service 
[Unit]
Description=My Shell Script

[Service]
ExecStart=/usr/bin/script.sh

[Install]
WantedBy=multi-user.target

$ systemctl daemon-reload 
$ systemctl enable shellscript.service 
$ systemctl start shellscript.service 

但在检查服务状态时,我得到:

$ systemctl status shellscript.service

shellscript.service - My Shell Script
     Loaded: loaded (/lib/systemd/system/shellscript.service; enabled; vendor preset: disabled)
     Active: failed (Result: exit-code) since Mon 2022-05-23 13:20:33 EEST; 14s ago
    Process: 1276 ExecStart=/usr/bin/script.sh (code=exited, status=1/FAILURE)    Main PID: 1276 (code=exited, status=1/FAILURE)
        CPU: 10ms
May 23 13:20:33 kali systemd[1]: Started My Shell Script. 
May 23 13:20:33 kali script.sh[1276]: /usr/bin/script.sh: line 25: AthanMayT.txt: No such file or directory 
May 23 13:20:33 kali systemd[1]: shellscript.service: Main process exited, code=exited, status=1/FAILURE 
May 23 13:20:33 kali systemd[1]: shellscript.service: Failed with result 'exit-code'.

答案1

你的shellscript.service定义有效。 shell 脚本已执行,但脚本第 25 行的某些命令返回错误消息:

AthanMayT.txt: No such file or directory

这导致脚本退出并显示状态码 1,表示失败。

此类错误通常是由于当前工作目录不是您所期望的目录而引起的。

您应该注意,由 systemd 执行的任何进程或脚本systemd通常不会在任何用户的主目录中执行:由 systemd 启动的任何进程的默认工作目录将是系统的根目录,或/.

要进行故障排除,请像这样运行脚本来模拟 systemd 执行时的条件:

cd /
/usr/bin/script.sh

您可能应该对脚本中引用的每个文件使用完整路径名,或者cd /full/path/to/some/directory在脚本的开头显式包含 a 以确保按照您期望的方式解释相对路径名。

相关内容