2016-09-06 8 views
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」が表示されます。 だから、スクリプトの何が間違っているのか誰にでも教えてもらえますか?

+0

これは実装に依存します。これが決定的な答えだとは言いません。通常、シグナルマスク(無視されたシグナル)は子プロセスによって継承されますが、 'sudo'は独自のシグナル処理を行い、' trap'をオーバーライドします。ユーザプロセスから送られたSIGHUPは実行中のコマンドに中継されますが、あなたのシステムでは 'man sudo'を実行し、権威的な答えに対して'シグナルハンドリング 'を探します。 – cdarke

+0

'shopt -u huponexit'を試してください – cdarke

+0

ちょっと不思議なことに、なぜ' bash -c'が必要ですか? 'cat'は' bash'に接続されていない外部プログラムです。 – cdarke

答えて

0
。。まだ根本的な原因がわからない私は、この問題を解決し、私自身の質問に答えるが、

を私がする「sudo」をのコードを変更:

echo 'abc123!' | sudo -S -p '' cat /etc/shadow > /tmp/test.log 2>&1 

が可能な理由は、端末を閉じているときに、標準出力新しい標準出力を明示的に割り当てる必要があります。

関連する問題