デーモンとして実行したいプログラムがありますが、これを仮想プログラムと呼びます。これらのパラメータを解析する必要があるため、起動スクリプト、設定ファイル、プログラム自体、およびその依存関係はすべて同じフォルダに必要です/usr/share/dummy
。各プログラム、スクリプトなどは0755です。
(はい、これは完璧ではないことを知っています。通常、プログラムはbin
dependency lib
、config、etc
または他の場所にあります。これは単なる概念証明デーモンテストです。)
プログラムサービスファイル:
[Unit]
Description=Dummy daemon program
After=default.target
[Service]
User=root
ExecStart=/usr/share/dummy/dummyd_start.sh
[Install]
WantedBy=default.target
私の起動スクリプト(やや):
#!/bin/bash
#Some config parsing...
sudo ./dummy $PARAM
現在、パラメータを処理する必要があり、プログラムにもroot権限が必要なため、サービスファイルからプログラム自体を呼び出すことはできません。
その場所()で起動スクリプトを実行すると、sudo ./dummy_start.sh
プログラムが正しく実行されます。しかし、systemd
起動するとプログラム自体が見つかりません。
Mar 10 16:42:52 debian systemd[1]: Started Dummy daemon program.
Mar 10 16:42:52 debian bash[10690]: sudo: ./dummy: command not found
Mar 10 16:42:52 debian systemd[1]: dummy.service: Main process exited, code=exited, status=1/FAILURE
Mar 10 16:42:52 debian systemd[1]: dummy.service: Failed with result 'exit-code'.
サービスファイルの呼び出しを変更すると(たとえばExecStart=/bin/bash -c /usr/share/dummy/dummyd_start.sh
、絶対パス全体で起動スクリプトからプログラムを呼び出すと(したがって、このような起動スクリプトでsudo ./usr/share/dummy/dummy $PARAM
)、プログラムが見つかりますが、依存関係は見つかりません。
Mar 10 16:26:23 debian systemd[1]: Started Dummy daemon program.
Mar 10 16:26:23 debian sudo[10420]: root : PWD=/ ; USER=root ; COMMAND=./usr/share/dummy/dummy -p some_parameters
Mar 10 16:26:23 debian sudo[10420]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=0)
Mar 10 16:26:23 debian bash[10421]: ./usr/share/dummy/dummy: error while loading shared libraries: libmysqlclient.so.21: cannot open shared >
Mar 10 16:26:23 debian sudo[10420]: pam_unix(sudo:session): session closed for user root
Mar 10 16:26:23 debian systemd[1]: dummy.service: Main process exited, code=exited, status=127/n/a
Mar 10 16:26:23 debian systemd[1]: dummy.service: Failed with result 'exit-code'.
私が何を見逃しているのか知っている人はいますか?
ベストアンサー1
コードは、スクリプトがこの行を実行すると、どのディレクトリにあっても現在のディレクトリを検索しよう./dummy $PARAM
とします。dummy
これがスクリプトが呼び出されるディレクトリを表す可能性があるのは一般的な誤解です。
スクリプトを手動で起動するcd /usr/share/dummy; ./dummyd_start.sh
か、ファイルマネージャでクリックして同様の操作を実行できるようです。
コードが特定の現在の作業ディレクトリに依存している場合は使用する必要がありますcd
。
別のオプションは、実行中のスクリプトの場所を確認し、それを呼び出されたすべてのスクリプトの前に追加することです。