スクリプトを実行するフォークされたexecプロセスにSIGINTを送信しても、それは強制終了されません

Faustas Butkus

Cでシェルアプリケーションを作成していますが、実行中のスクリプトを処理するためにSIGINTを送信しても停止しないという問題が発生しました。

同じシグナルを通常の実行可能ファイルに送信することは問題なく機能します。

例:

長時間動作するスクリプト(work.sh)を模倣するBashスクリプト:

#! /bin/bash

COUNTER=0
while true
do
    ((COUNTER+=1))
    echo "#${COUNTER} Working..."
    sleep 1
done

Cコード:

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        char* cmds[] = { "./work.sh", NULL };
        if (execvp(cmds[0], cmds) == -1) {
            exit(1);
        }
    } else {
        sleep(5);
        kill(pid, SIGINT);
    }

    return 0;
}

シグナルを送信した後、メインプロセスは終了しますが、スクリプトは印刷を続行します。

スクリプトでの信号処理はどういうわけか異なりますか?実行中のものを無視して子プロセスを停止するにはどうすればよいですか?

gst

解決策:

work.shスクリプトの上に次の行を追加trap exit SIGINTして、明示的なSIGINTハンドラーを作成ます

#! /bin/bash

trap exit SIGINT

COUNTER=0
while true
do
    ((COUNTER+=1))
    echo "#${COUNTER} Working..."
    sleep 1
done

実行work可能ファイルを実行すると、次のように出力されます。

#1 Working...
#2 Working...
#3 Working...
#4 Working...
#5 Working...

その後、シェルに戻ります。

問題:

私はこのウェブページがUnixスタックエクスチェンジのこの質問へのコメントでリンクされているのを見つけました(完全を期すために、ここでも受け入れられた答えでリンクされたウェブページです。)これは何が起こっているかを説明するかもしれない引用です:

bashは、SIGINT / SIGQUIT配信の処理で待機および協調出口アプローチを実装する数少ないシェルの1つです。スクリプトを解釈するとき、SIGINTを受信すると、すぐには終了しませんが、代わりに、現在実行中のコマンドが戻るのを待ち、そのコマンドもそのSIGINTによって強制終了された場合にのみ終了します(SIGINTで自身を強制終了します)。たとえば、スクリプトがviを呼び出し、vi内でCtrl + Cを押してアクションをキャンセルした場合、それはスクリプトを中止する要求とは見なされないという考え方です。

したがって、スクリプトを作成していて、そのスクリプトがSIGINTを受信すると正常に終了するとします。つまり、そのスクリプトが別のbashスクリプトから呼び出された場合、Ctrl-Cは他のスクリプトを中断しなくなります。

この種の問題は、設計上SIGINTで正常に終了する実際のコマンドで見られます。

編集:

はそれをさらによく説明する別のUnixスタックエクスチェンジの答えを見つけましたbash(1)マニュアルページを見ると、以下も非常に説明的です。

bashによって実行される非組み込みコマンドでは、シグナルハンドラーが、シェルによってその親から継承された値に設定されます。ジョブ制御が有効になっていない場合、非同期コマンドは、これらの継承されたハンドラーに加えて、SIGINTおよびSIGQUITを無視します。

特にそれを考慮するとき:

シェルへの入力時に無視された信号は、トラップ、リセット、またはリストすることはできません。

基本的に、runningwork.shは別の実行環境で実行します。

組み込み関数またはシェル関数以外の単純なコマンドを実行する場合は、別の実行環境で呼び出されます。

これは無視します(明示的に存在しない場合)のシグナルハンドラが含まSIGINTSIGQUIT、デフォルトでは。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

bashスクリプトを強制終了しても、子プロセスは強制終了されません

分類Dev

フォークされたプロセスを強制終了できません

分類Dev

スクリプトからdockercontainer内で実行されているプロセスを強制終了します

分類Dev

スクリプトが終了した後、または強制終了された後にサブプロセスを強制終了する

分類Dev

別のスクリプトによって実行されたスクリプトを強制終了する方法

分類Dev

別のスクリプトによって実行されたスクリプトを強制終了する方法

分類Dev

Linuxで実行されているPythonスクリプト内のプロセスを強制終了する

分類Dev

プロセス/ SPIDはそれ自体でブロックされています。SQLServerを再起動せずにクリア/強制終了する方法

分類Dev

cronを介して実行されているシェルスクリプトでプロセスを強制終了する方法は?

分類Dev

別のプログラムによって実行されたプロセスを強制終了しますが、そのプログラムの他のインスタンスは実行しません

分類Dev

systemd:フォークされたプロセスのいずれかが強制終了された場合にサービスを再起動します

分類Dev

デスクトップショートカットランチャーを介して実行されたスクリプトによって作成されたプロセスを、実行が終了した後も存続させるにはどうすればよいですか?

分類Dev

sshセッションを強制終了した後もリモートプロセスが実行されるのはなぜですか?

分類Dev

npmプロセスを強制終了した後もポートはまだ使用されていますか?

分類Dev

VNCサーバーを強制終了すると、そのサーバーで実行されているプロセスが強制終了されますか?

分類Dev

スクリプトを強制終了せずに、bashscriptで実行中のプロセスを強制終了するにはどうすればよいですか?

分類Dev

指定されたプロセスが%CPUに達したときにそれを強制終了するスクリプト

分類Dev

ポート80で実行されているプロセスを強制終了します

分類Dev

QProcessは、ヒープで定義されている場合、プロセスを強制終了/終了しません

分類Dev

Linuxで昇格された権限で実行されたプロセスを強制終了すると、ソケットがロックされます

分類Dev

同時に実行されているプロセスを強制終了できません

分類Dev

Pythonスクリプト内からWindows上のバッチファイルによって開始された外部プロセスを強制終了します

分類Dev

Pythonスクリプト内からWindows上のバッチファイルによって開始された外部プロセスを強制終了します

分類Dev

現在実行されている行を強制終了せずにシェルスクリプトを強制終了する方法

分類Dev

ノードJS-子プロセスExecで実行されたプロセスを強制終了できません

分類Dev

スクリプトは追加されたデータに対しては実行されませんが、フォーム内の事前に記述されたhtmlコードに対して実行されます。また、スクリプトはすでにページの上部にロードされています。

分類Dev

Pythonプロセスが強制終了されたらatexit()を実行します

分類Dev

ループで実行されているときにPerlスクリプトを強制的に終了するにはどうすればよいですか?

分類Dev

Python:subprocess.Popenを使用して長時間実行プロセスを実行し、それを強制終了し、その出力にアクセスします

Related 関連記事

  1. 1

    bashスクリプトを強制終了しても、子プロセスは強制終了されません

  2. 2

    フォークされたプロセスを強制終了できません

  3. 3

    スクリプトからdockercontainer内で実行されているプロセスを強制終了します

  4. 4

    スクリプトが終了した後、または強制終了された後にサブプロセスを強制終了する

  5. 5

    別のスクリプトによって実行されたスクリプトを強制終了する方法

  6. 6

    別のスクリプトによって実行されたスクリプトを強制終了する方法

  7. 7

    Linuxで実行されているPythonスクリプト内のプロセスを強制終了する

  8. 8

    プロセス/ SPIDはそれ自体でブロックされています。SQLServerを再起動せずにクリア/強制終了する方法

  9. 9

    cronを介して実行されているシェルスクリプトでプロセスを強制終了する方法は?

  10. 10

    別のプログラムによって実行されたプロセスを強制終了しますが、そのプログラムの他のインスタンスは実行しません

  11. 11

    systemd:フォークされたプロセスのいずれかが強制終了された場合にサービスを再起動します

  12. 12

    デスクトップショートカットランチャーを介して実行されたスクリプトによって作成されたプロセスを、実行が終了した後も存続させるにはどうすればよいですか?

  13. 13

    sshセッションを強制終了した後もリモートプロセスが実行されるのはなぜですか?

  14. 14

    npmプロセスを強制終了した後もポートはまだ使用されていますか?

  15. 15

    VNCサーバーを強制終了すると、そのサーバーで実行されているプロセスが強制終了されますか?

  16. 16

    スクリプトを強制終了せずに、bashscriptで実行中のプロセスを強制終了するにはどうすればよいですか?

  17. 17

    指定されたプロセスが%CPUに達したときにそれを強制終了するスクリプト

  18. 18

    ポート80で実行されているプロセスを強制終了します

  19. 19

    QProcessは、ヒープで定義されている場合、プロセスを強制終了/終了しません

  20. 20

    Linuxで昇格された権限で実行されたプロセスを強制終了すると、ソケットがロックされます

  21. 21

    同時に実行されているプロセスを強制終了できません

  22. 22

    Pythonスクリプト内からWindows上のバッチファイルによって開始された外部プロセスを強制終了します

  23. 23

    Pythonスクリプト内からWindows上のバッチファイルによって開始された外部プロセスを強制終了します

  24. 24

    現在実行されている行を強制終了せずにシェルスクリプトを強制終了する方法

  25. 25

    ノードJS-子プロセスExecで実行されたプロセスを強制終了できません

  26. 26

    スクリプトは追加されたデータに対しては実行されませんが、フォーム内の事前に記述されたhtmlコードに対して実行されます。また、スクリプトはすでにページの上部にロードされています。

  27. 27

    Pythonプロセスが強制終了されたらatexit()を実行します

  28. 28

    ループで実行されているときにPerlスクリプトを強制的に終了するにはどうすればよいですか?

  29. 29

    Python:subprocess.Popenを使用して長時間実行プロセスを実行し、それを強制終了し、その出力にアクセスします

ホットタグ

アーカイブ