0
sshタイムアウトまたは端末が閉じていてもbash関数を実行し続けたいと思っています。別に呼び出すための新しいスクリプトファイルを作成したくないので、私は目標を達成するためにnohupと '&'メソッドを使用しました。なぜbashバックエンド関数は、親がデッドしたときに失敗を返すのですか?
(
trap "" HUP
sleep 10
echo 'abc123!' | sudo -S -p '' bash -c "cat /etc/shadow"
ret=$?
if [ $ret -ne 0 ]; then
echo "failed-->$ret" >> /tmp/test.log
fi
)&
上記は私のスクリプトの一部であり、親が死んでも実行を続ける必要があることを表しています。 このスクリプトはroot以外のユーザーによって実行されるため、sudoを使用していくつかのコマンドを実行する必要があります。 このスクリプトは、親が生きているときに正常に戻ります。 しかし、実行中の端末を閉じると、子プロセスが終了した後にtest.logファイルに「failed-> 1」が表示されます。 だから、スクリプトの何が間違っているのか誰にでも教えてもらえますか?
これは実装に依存します。これが決定的な答えだとは言いません。通常、シグナルマスク(無視されたシグナル)は子プロセスによって継承されますが、 'sudo'は独自のシグナル処理を行い、' trap'をオーバーライドします。ユーザプロセスから送られたSIGHUPは実行中のコマンドに中継されますが、あなたのシステムでは 'man sudo'を実行し、権威的な答えに対して'シグナルハンドリング 'を探します。 – cdarke
'shopt -u huponexit'を試してください – cdarke
ちょっと不思議なことに、なぜ' bash -c'が必要ですか? 'cat'は' bash'に接続されていない外部プログラムです。 – cdarke