GNU/Linux >> Linux の 問題 >  >> Linux

Sigintが子プロセスに到達するのを防ぎますか?

サーバーを実行するためのbashスクリプトがあります。これは通常、ユーザーがCtrl-Cを使用して終了します。 。終了時に、クリーンアップ関数を実行します。これは、2番目のCtrl-Cによって中断されたくありません。 。

#!/bin/bash

...

function cleanup {
    trap '' INT
    echo -n " Cleaning up..."
    scp $SRV:~/$DIR/server.log . && ssh -t $SRV "rm -rf ~/$DIR"
    echo " Finished."

    exit 0
}
trap cleanup EXIT

...

現時点では、2番目のCtrl-C scpの前 終了すると、スクリプトが無期限にハングします。これはSIGINTと関係があることを理解しています bashスクリプトとscpの両方に送信されます プロセスですが、クリーンアップが失敗するだけでなく、これによってスクリプトがハングする理由がわかりません。

だから私の質問は:

  1. これによりスクリプトがハングするのはなぜですか?
  2. SIGINTがscpに到達しないようにするにはどうすればよいですか。 およびssh 子プロセス?

承認された回答:

trap '' INT シェルとそのすべての子のSIGINTを無視することを目的としています。

しかし、straceを見てください scpの出力 、scpのように見えます 上記のSIG_IGNをキャンセルする独自のSIGINTハンドラーをインストールします。

SIGINTを取得しないようにする唯一の方法は、次のような別のプロセスグループで実行することです。

perl -MPOSIX -e 'setpgid 0,0; exec @ARGV' scp...

または

(set -m; scp ... & wait)

または、Ctrl-CでSIGINTの送信を停止するようにttyドライバーに指示します(stty -isigのように) 、またはstty intr '' ^Cの場合 単独で)、後で設定を復元したい場合:

saved=$(stty -g)
stty intr ''
scp ...
stty "$saved"

Linux
  1. bashスクリプトが同時に実行されないようにする

  2. Ssh –ネットワーク内のScpを自動化するスクリプト?

  3. TmuxがSshで起動しないようにしますか?

  1. インタラクティブシェルのセッションのプロセスとスクリプトのプロセス?

  2. 実行されたスクリプトが終了すると、Gnu Screenがセッションを終了しないようにしますか?

  3. C プログラム内からプログラムを実行する

  1. URLからbashスクリプトを実行

  2. ssh がシェル スクリプト パラメータを分割しないようにする

  3. 子プロセスが親の SIGINT を受け取る