sudo
次の行のいずれかを実行した後も引き続き実行されることがわかりました。sudo
これ以上実行しないようにデーモンを完全に分離する方法はありますか?
sudo -u user daemon &
sudo -u user -b daemon
答え1
次のように一度に背景として設定できます。
sudo -u user sh -c "daemon & disown %1"
ビューにはRunningがps
表示されます。それに関連するものは何もありません。daemon
user
sudo
答え2
sudo
要求されたプログラムを実行した後、実行状態は維持されなくなります。実際には、exec()
システムコールを使用して、プログラムが同じPIDを持つことを指定したプログラムに置き換えますsudo
。次のコマンドを実行してこれを確認できます。
sudo -u user -b sleep 60
ps aux | grep sudo
ps aux | grep sleep
sleepはまだ実行中ですが、sudoは実行されていないことがわかります。
&
演算子を使用して sudo をバックグラウンドに配置するようにシェルに要求すると、sudo はパスワードの入力を求める必要がある場合、バックグラウンドでブロックして無期限に待機します。パスワードの入力を求められない場合、指定したプログラムは実行され、sudo
再実行されません。 -bスイッチはブロック可能性のために好ましい方法であるsudo
ため、必要に応じてパスワードの入力を求められ、要求されたプログラムを実行するためにバックグラウンドに分岐されます。
答え3
申し訳ありません。これは実際には答えではなく、追加のコメントに近いです。
psusiの応答にもかかわらず、いくつかのバージョンは常にそうですsudo
(指定されていない場合はfork()
子プロセスを待ちます)。-b
usingの問題は、デーモンのPIDが含まれていないこと-b
です。 usingの問題は、argsをtoに渡すことがかなり歪んでいることです。 Twistはまずsudoを使用する主な理由です。$!
daemonize
sudo sh -c 'run_my_daemon arg1 arg2 arg3... & save_pid $!'
run_my_daemon
最初からルートでない場合は、パスワードを待つことを心配するだけです。特に、すでにsudo -u $run_as_uid prog "${args[@]}"
rootとして実行されているスクリプト内でパスワードを使用することを検討してください。
答え4
プログラムがあればdaemonize
使用してくださいsudo daemonize PATH_TO_DAEMON
。