Linux起動スクリプト/etc/initと特定のユーザー

Linux起動スクリプト/etc/initと特定のユーザー

/etc/init/mms-agent.confにスクリプトを作成しました。

start on runlevel [2345]
stop on runlevel [06]

exec /usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1

MMSプロキシの開始/停止サービスは正常に機能しますが、「MMS」ユーザーとしてこのサービスを開始したいと思います。

次のようにスクリプトを変更しようとすると:

exec su mms -c "/usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1"

予想される1つ(su、bash +私のPythonスクリプト)の代わりに3つのプロセスが実行されています。

mms       8864  0.0  0.2  37816  1332 ?        Ss   22:30   0:00 su mms -c /usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1
mms       8865  0.0  0.2  11452  1196 ?        S    22:30   0:00 bash -c /usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1
mms       8866  4.0  1.8  54672 10640 ?        Sl   22:30   0:00 python /home/mms/mms-agent/agent.py

それはどういう意味ですか?

root以外のユーザーとしてスクリプトを起動する最良の方法は何ですか?

ありがとう

添付:

exec start-stop-daemon --start -u mms --exec "/usr/bin/env python /home/mms/mms-agent/agent.py"

動作しません。エラーは発生しませんが、プロセスはまだ開始されていません。

答え1

バラより他のユーザーとしてジョブを実行するUpstart マニュアルにあります。使用するstart-stop-daemonことが推奨される方法です。

私はちょっとした間違いをしました。start-stop-daemon実行可能ファイルへのパスが必要なコマンドライン全体を渡しました。パラメータを別々に渡します。

呼び出しの別の問題は、start-stop-daemonすべてのPythonプロセスをサービスのインスタンスと見なすように指示することです。これにより、関連していない他のPythonプロセスが終了する可能性があります。サービスに1つのインスタンスのみを実行させるには、pidfileを使用します。

exec start-stop-daemon --start -c mms -u mms -m -p /var/run/mms-agent.pid \
                       --startas /usr/bin/env -- python /home/mms/mms-agent/agent.py

答え2

execを実行すると、suシェルはプロセスに置き換えられますsusuその後、フォークとexecs bashbash出力リダイレクトを設定し、分岐と実行を設定しますenvenvPATHを検索して検索してpython実行します。したがって、1)終了をsu待つプロセスbash、2)(以前)終了をbash待つプロセス、3)スクリプトを実行しています。pythonenvpython

何の問題もありません。 su一時的にユーザーを切り替える歴史的なUnixメソッドなので、この方法を使用する必要があります。繰り返しますが、コマンドラインを実行する方法はシェルを使用することですので、実行して理解して処理するsuようbashbashしてください。繰り返しますが、これは他のアプリケーションでシェルコマンドラインとPATH検索機能を再開発するのではなく、シェルが自分の能力に合った作業を実行できるようにする一般的なUnixツールボックスのアプローチに従います。

また、bashすでにPATH検索が行われているので、あきらめてenv直接呼び出すこともできますpython

答え3

Pythonプロセスを実行するためにシェルを起動するsuを実行しているため、3つのプロセスが作成されます。

「追加」 2 つのプロセスが終了できると信じさせるさまざまな方法があります。たとえば、Pythonスクリプトフォークとexecを使用したり、suバックグラウンドを使用してコマンド自体を実行したりできます。

関連情報