スクリプトから起動したアプリケーションでControl + Cを押すと、スクリプトが壊れてしまうのはなぜですか?

ウィルヒル

まっすぐ飛び込むには:

while true; do
    #---  MENU LOGIC HERE, stick response in $MENUEXIT

    #----Deal with responses here

    if [ $S1 == $MENUEXIT ];
    then
            tail -f /path-to-file
    else
            sleep 2
    fi
done

私はこれをできるだけ単純に保つように努めました。もっと必要な場合は、私に知らせてください。

基本的にはメニューをループ状に貼り付けているので、ユーザー入力が間違っていたり、コマンドが終了したりすると、メニューを再表示することになります。

tailコマンドを追加するまでは、問題なく動作しました。

メニューからtailオプションを選択すると、tailコマンドは正常に起動しますが、Ctrl+Cを押すと、tailを終了してメニューを表示したいのですが、代わりにtailスクリプトの両方を終了します。

コンティニュー/トラップなど色々試してみましたが、レンガの壁にぶつかって助けてください!

ムル

端末からSIGINTCtrlC)やSIGSTOPCtrlZ)のような信号を送信すると、その信号はフォアグラウンドプロセスグループに送信されます。つまり、フォアグラウンドジョブ(スクリプト)と、フォアグラウンド(コマンド)にある子プロセスで構成されるグループです。これにより、これらすべてのプロセスが終了します(または、シグナルを処理することによって実行することは何でも実行します)。次のコマンドを使用して信号を送信することにより、違いをテストできますtailkill

1つの端末で、このスクリプトを実行します(test次のコマンドで呼び出します)。

#! /bin/bash

while true
do
    if [[ $1 = a ]]
    then
        yes 
    else
        echo no
        sleep 2
    fi
done

別の方法では、次のコマンドを実行します。

pstree -ps $(pgrep -f test)
pkill -f test
pstree -ps $(pgrep -f yes)

コマンドの出力は次のようになります。

init(1)───lightdm(1032)───lightdm(1154)───init(1173)───x-terminal-emul(17009)───bash(24262)───test.sh(24996)───yes(24997)
# No output for pkill
init(1)───lightdm(1032)───lightdm(1154)───init(1173)───yes(24997)

(実際の数とプログラムは異なる場合がありますが、最初のinitには常にpid 1が含まれます。)
ご覧のとおり、yesコマンドは強制終了されずinit、親が強制終了されたために接続されました。それはまだy最初の端末で陽気にsを印刷しています。だからそれをで殺しpkill -f yesます。ここで、1つの変更を加えて、実験を繰り返します。の代わりにpkill -f test、次のようにします。

kill -INT -25165 
# Use the pid of test.sh given in parentheses in the output of pstree 
# instead of 25165

先頭のに注意してください-Linuxでは、killコマンドの-25165場合、リーダーがpidを持つプロセスグループ25165です。したがって、このコマンドは、端末から割り込みを送信するのと同じです。

もちろん、正確な動作は、TTY、ログインシェルなどの構成によって異なります。これは私の理解の範囲内です。参考文献:


私は提案します:

  1. tailバックグラウンドに送信する
  2. 信号をトラップする
  3. バックグラウンドプロセスを強制終了します。
  4. トラップを削除します

例:

#! /bin/bash

kill_jobs ()
{
    kill %1
}

while true
do
    if [[ $1 = "a" ]]
    then
        trap kill_jobs INT
        tail -f /var/log/syslog &
        wait %%
        shift #You don't need to shift, I just didn't want loop tail on this example
        trap - INT
    else
        echo some output
        sleep 2
    fi
done

これは、トラップにさまざまな関数を使用し、それぞれが独自のクリーンアップ作業を行うことで、非常に強力になる可能性があります。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

UbuntuデスクトップからWindowsでアプリケーションを起動します

分類Dev

スプリングブートアプリケーションは、cmdから起動する方法をcmdから記述しませんでした

分類Dev

〜/ usrにインストールされたアプリはターミナルから起動しますが、[アプリケーション]メニューからは起動しません(または、.profileでのld_library_pathの設定が正常に機能しないのはなぜですか)

分類Dev

Gradleのアプリケーションプラグインによって生成された起動スクリプトで、プログラム名をアプリケーションに渡すにはどうすればよいですか?

分類Dev

JMeterを介したアプリケーションの起動時にページのコンテンツが読み込まれない場合でも、インポートされたスクリプトを実行できますか?

分類Dev

BashスクリプトからBashスクリプトを開始してGUIアプリケーションを起動する

分類Dev

Springアプリケーションが起動しない:アプリケーションがクラスパスで起動できませんでした

分類Dev

Spring Boot Webアプリケーションがまだ起動しているときにhttpリクエストを受け入れないようにするにはどうすればよいですか?

分類Dev

タスクバーまたはクイック起動からJavaアプリケーションを最大化するためのキーボードショートカットを追加するにはどうすればよいですか?

分類Dev

自動更新サブスクリプションをテストするアップルのサンドボックスサーバーからの返信でステータス値として21004が返されるのはなぜですか?

分類Dev

この例のスペースに出会うと、bashスクリプトが壊れてしまうのはなぜですか?

分類Dev

ユーザーをリダイレクトしてスキャナーアプリケーションを起動することは可能ですか?

分類Dev

パネルのOperaアイコンをクリックした後、設定アプリケーションが起動するのはなぜですか?

分類Dev

フラスコCLIを使用してアプリを実行すると、「有効なFlaskアプリケーションが...から取得されませんでした」というエラーが表示されるのはなぜですか?

分類Dev

アプリケーションを再起動したときに編集テキストが表示されないのはなぜですか?

分類Dev

`fc-cache -f`を実行せずに、手動でインストールしたフォントをすべてのアプリケーションからアクセスできるようにするにはどうすればよいですか?

分類Dev

起動時に実行され、アプリケーションの起動に遅延をもたらすシェル スクリプトを作成するにはどうすればよいですか

分類Dev

nginxを使用してURIをリバースプロキシとして書き換えることはできますが、アプリケーションがアクセスするために、なんらかの方法でURIをリクエストに保持しますか?

分類Dev

dartの最後の更新後にリファクタリングオプションがなくなりました。どうすればよいですか。再起動してVisualStudio Codeをアンインストールしようとしましたが、何も起こりませんでした。

分類Dev

WebフォームからクライアントマシンでMSWordアプリケーションを起動します。(すべてのブラウザ)

分類Dev

デスクトップ環境なしでubuntuを起動しますが、Xアプリケーションを起動します

分類Dev

デスクトップ環境なしでubuntuを起動しますが、Xアプリケーションを起動します

分類Dev

pkexecがQtベースのアプリケーションをrootユーザーとして起動しないのはなぜですか?

分類Dev

Pythonスクリプト(または他のプログラミング言語スクリプト)を使用して、他のアプリケーションで使用されるリソース(RAM、CPU使用率など)を制限できますか?

分類Dev

GNOME Shellを使用しながら、デスクトップからシンボリックリンクされた実行可能アプリケーションを実行するにはどうすればよいですか?

分類Dev

Sublimeが他のアプリケーションとしてインストールされなかったのはなぜですか?

分類Dev

セットアップが完了したときにExcelアプリケーションを起動するにはどうすればよいですか?

分類Dev

モノアプリケーションが自分のディレクトリからのみ起動するのはなぜですか?

分類Dev

デスクトップではなくアプリケーションに直接Windows8.1および/またはEmbeddedを起動します

Related 関連記事

  1. 1

    UbuntuデスクトップからWindowsでアプリケーションを起動します

  2. 2

    スプリングブートアプリケーションは、cmdから起動する方法をcmdから記述しませんでした

  3. 3

    〜/ usrにインストールされたアプリはターミナルから起動しますが、[アプリケーション]メニューからは起動しません(または、.profileでのld_library_pathの設定が正常に機能しないのはなぜですか)

  4. 4

    Gradleのアプリケーションプラグインによって生成された起動スクリプトで、プログラム名をアプリケーションに渡すにはどうすればよいですか?

  5. 5

    JMeterを介したアプリケーションの起動時にページのコンテンツが読み込まれない場合でも、インポートされたスクリプトを実行できますか?

  6. 6

    BashスクリプトからBashスクリプトを開始してGUIアプリケーションを起動する

  7. 7

    Springアプリケーションが起動しない:アプリケーションがクラスパスで起動できませんでした

  8. 8

    Spring Boot Webアプリケーションがまだ起動しているときにhttpリクエストを受け入れないようにするにはどうすればよいですか?

  9. 9

    タスクバーまたはクイック起動からJavaアプリケーションを最大化するためのキーボードショートカットを追加するにはどうすればよいですか?

  10. 10

    自動更新サブスクリプションをテストするアップルのサンドボックスサーバーからの返信でステータス値として21004が返されるのはなぜですか?

  11. 11

    この例のスペースに出会うと、bashスクリプトが壊れてしまうのはなぜですか?

  12. 12

    ユーザーをリダイレクトしてスキャナーアプリケーションを起動することは可能ですか?

  13. 13

    パネルのOperaアイコンをクリックした後、設定アプリケーションが起動するのはなぜですか?

  14. 14

    フラスコCLIを使用してアプリを実行すると、「有効なFlaskアプリケーションが...から取得されませんでした」というエラーが表示されるのはなぜですか?

  15. 15

    アプリケーションを再起動したときに編集テキストが表示されないのはなぜですか?

  16. 16

    `fc-cache -f`を実行せずに、手動でインストールしたフォントをすべてのアプリケーションからアクセスできるようにするにはどうすればよいですか?

  17. 17

    起動時に実行され、アプリケーションの起動に遅延をもたらすシェル スクリプトを作成するにはどうすればよいですか

  18. 18

    nginxを使用してURIをリバースプロキシとして書き換えることはできますが、アプリケーションがアクセスするために、なんらかの方法でURIをリクエストに保持しますか?

  19. 19

    dartの最後の更新後にリファクタリングオプションがなくなりました。どうすればよいですか。再起動してVisualStudio Codeをアンインストールしようとしましたが、何も起こりませんでした。

  20. 20

    WebフォームからクライアントマシンでMSWordアプリケーションを起動します。(すべてのブラウザ)

  21. 21

    デスクトップ環境なしでubuntuを起動しますが、Xアプリケーションを起動します

  22. 22

    デスクトップ環境なしでubuntuを起動しますが、Xアプリケーションを起動します

  23. 23

    pkexecがQtベースのアプリケーションをrootユーザーとして起動しないのはなぜですか?

  24. 24

    Pythonスクリプト(または他のプログラミング言語スクリプト)を使用して、他のアプリケーションで使用されるリソース(RAM、CPU使用率など)を制限できますか?

  25. 25

    GNOME Shellを使用しながら、デスクトップからシンボリックリンクされた実行可能アプリケーションを実行するにはどうすればよいですか?

  26. 26

    Sublimeが他のアプリケーションとしてインストールされなかったのはなぜですか?

  27. 27

    セットアップが完了したときにExcelアプリケーションを起動するにはどうすればよいですか?

  28. 28

    モノアプリケーションが自分のディレクトリからのみ起動するのはなぜですか?

  29. 29

    デスクトップではなくアプリケーションに直接Windows8.1および/またはEmbeddedを起動します

ホットタグ

アーカイブ