web-dev-qa-db-ja.com

Systemdサービス、作業ディレクトリがディレクトリを変更しない

このスクリプトを作成しました:

[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)

このメッセージは、スクリプトが見つからないことを意味すると理解しました...なぜ作業ディレクトリが機能しないのですか?

ありがとう。

4
Roi Amiel

Systemd WorkingDirectory= setting は、シェルで作業しているときにcdを使用してディレクトリを変更する場合と同じように、サービスを起動するディレクトリを定義します。

これは、他のすべてのパス(ExecStart=からのパスを含む)が相対パスになることを意味するものではないため、そのディレクティブでスクリプトへのパスを完全に指定する必要があります。

ExecStart=/home/someuser/somescript.sh

おそらく、代わりに RootDirectory=ディレクティブ を考えていたのでしょうか?そのディレクトリはchrootコマンドを使用して、指定したディレクトリによってプロセスから見えるファイルシステムのルートを切り替えるので、スクリプトの場所に/を使用すると、欲しい...しかし、RootDirectory=を使用するには、バイナリとライブラリがその下にあるシステムイメージが必要です。同様に、Shellスクリプトを実行するには/bin/sh、libcなどを使用して/libが必要です。通常、RootDirectory=を使用してほぼすべてのディレクトリを作成することはできません好む...

したがって、ここでの問題を解決するための私のアドバイスは、ExecStart=を更新して、スクリプトへの完全なパスをリストすることです。

6
filbranden