このスクリプトを作成しました:
[Unit]
Description=test
[Service]
WorkingDirectory=/home/someuser
ExecStart=/somescript.sh
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=autodeploy
Environment=NODE_ENV=production PORT=1494
[Install]
WantedBy=multi-user.target
しかし、私がそれを実行しているとき、それは言います:
Process: 8986 ExecStart=/somescript.sh (code=exited, status=203/EXEC)
このメッセージは、スクリプトが見つからないことを意味すると理解しました...なぜ作業ディレクトリが機能しないのですか?
ありがとう。
Systemd WorkingDirectory=
setting は、シェルで作業しているときにcd
を使用してディレクトリを変更する場合と同じように、サービスを起動するディレクトリを定義します。
これは、他のすべてのパス(ExecStart=
からのパスを含む)が相対パスになることを意味するものではないため、そのディレクティブでスクリプトへのパスを完全に指定する必要があります。
ExecStart=/home/someuser/somescript.sh
おそらく、代わりに RootDirectory=
ディレクティブ を考えていたのでしょうか?そのディレクトリはchroot
コマンドを使用して、指定したディレクトリによってプロセスから見えるファイルシステムのルートを切り替えるので、スクリプトの場所に/
を使用すると、欲しい...しかし、RootDirectory=
を使用するには、バイナリとライブラリがその下にあるシステムイメージが必要です。同様に、Shellスクリプトを実行するには/bin/sh
、libcなどを使用して/lib
が必要です。通常、RootDirectory=
を使用してほぼすべてのディレクトリを作成することはできません好む...
したがって、ここでの問題を解決するための私のアドバイスは、ExecStart=
を更新して、スクリプトへの完全なパスをリストすることです。