LinuxでシェルスクリプトをSystemDサービスとして実行する

Linuxでシェルスクリプトを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定義は有効です。シェルスクリプトが実行されますが、行25の一部のコマンドはエラーメッセージを返します。

AthanMayT.txt: No such file or directory

これにより、スクリプトは失敗を示すステータスコード 1 で終了します。

この種のエラーは、通常、現在の作業ディレクトリが予想されるディレクトリと異なるために発生します。

systemdによって実行されるプロセスやスクリプトはsystemd通常、ユーザーのホームディレクトリでは実行されません。 systemdによって開始されたプロセスのデフォルトの作業ディレクトリは、システムのルートディレクトリまたは/

問題を解決するには、次のスクリプトを実行してsystemdが実行される条件をシミュレートします。

cd /
/usr/bin/script.sh

スクリプトで参照される各ファイルにフルパス名を使用するか、相対cd /full/path/to/some/directoryパス名が期待どおりに解釈されるようにスクリプトの先頭に明示的に含める必要があります。

関連情報