問題タブ [bash-trap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bash - 「トラップ EXIT」でシェル スクリプトの終了コードを取得する
次のように、Bash スクリプトでクリーンアップ アクションを実行したいと考えています。
を使用$?
するのは当然の選択として頭に浮かびましたが、そうではありません。常に含まれています0
。トラップ内の終了コードを「スパイ」する方法はありますERR
か?
[更新:]以前に何をテストしたかわかりません。このコードは魅力的に機能するので、小さくて良い例としてここに残します。
linux - シェルスクリプトはトラップでCTRL + Zを取得します
スクリプトの でSIGSTOP CTRL+Zシグナルを取得しようとしていますtrap
。
スクリプトの実行中に一時的に実行を中断し、SIGSTOP シグナルCTRL+Zを送信すると、作成したファイルを削除して実行を強制終了する必要があります。
次のスクリプトが機能しない理由がわかりません。しかし、もっと重要なのは、それを行う正しい方法は何ですか?
編集:
SIGSTOP
トラップすることはできませんが、トラップすることはできます。インターネットで検索したSIGTSTP
後に理解したことと、以下の回答から、 +で信号を送信するときにトラップするのは正しいです。ただし、スクリプトの実行中に+を押すと、スクリプトが停止します。つまり、後で送信するシグナルに関係なく、スクリプトが際限なく実行されます。
CTRLZCTRLZ
bash - スクリプト内の Trap コマンドは、CLI から呼び出された場合は機能しますが、PBS ジョブで使用された場合は機能しません
次の単純な bash スクリプトがあります。
コマンド ラインからこのスクリプトを実行すると、次のようになります。
次に、CTRL+CI を送信してスクリプトを中断し、2 つの電子メールを取得します。「受信シグナル EXIT」というメッセージを含むもの。もう一方には、「シグナル SIGINT を受信しました」というメッセージが含まれています。
ただし、このスクリプトを PBS ジョブとして実行すると、次のようになります。
そして、1、2 分待って、送信されたジョブで qdel を実行します。「受信シグナル EXIT」を含む電子メールしか受信しません。また、受信したシグナル SIGTERM を示す電子メールを受け取ることも期待していましたが、qdel のマニュアル ページには次のように記載されているためです。
誰かがこれがなぜなのか知っていますか? 理想的には、スクリプト内の何かが 0 以外の終了コードを返したときにメールを受信したいのですが、たとえば SIGINT や SIGTERM が原因でスクリプトが予想よりも早く終了したときにも別のメールを受信したいと考えています。
行を変更すると、いくつかの追加情報が表示されます。
に
最後に実行されたコマンドが「mailx -s "SIGTERM" "someone@anywhere.com"」であり、「sleep 1000」ではないことがわかります。したがって、SIGTERM シグナルがキャッチされるケースのようですが、後続のトラップ コマンドはキャッチされます。 PBS ジョブでは機能しません...
bash - トラップとそのエラー コードを使用して関数を終了する
私が次の機能を持っているとしましょう:
実行f
してその10秒待ってから実行すると
それは予想されます。しかし、実行f
してヒットするとCtrl+c
、関数f
は中止されますが、
の代わりに1
。私は適切にトラップしていないと思いますが、それを修正する方法はありません。
bash - スクリプトで tcpdump を終了し、次のコマンドの実行を続行する
私が持っているスクリプトを作成しようとしています:
CTRL + CIでtcpdumpを終了した後、これらのコマンドを実行したい:
最初の部分は完了していますが、CTRL + CI を押すとプロンプトが表示されます。同じ問題をトラップSIGINTで待機してみました。
ここで、明らかに邪魔にならないようにします。中間のフィルタリングされていない出力を一時ファイルにダンプせずに、単純にすべてをパイプしてみませんか? 試してみましたが、画面出力で情報が失われているようです (サーバーがビジー状態、わかりません)。このようにコマンドを分割すると、完全な出力が得られることがわかりました。
更新:以下の回答に基づいて、次のようにしてみました。これが最も安全な方法のようです。
うまくいきません。「ファイル」が生成されますが、その内容は sed | によって読み取られ、フィルタリングされていないようです。CTRL+C を実行した後の awk 構文は、rm コマンドによっても削除されていないため、これは、トラップされたセカンダリ関数が実行されていないことのさらなる証拠です。この動作がわかりません。何か間違っていますか?
更新 2:適切に動作させる唯一の方法は次のとおりです。
しかし、バックグラウンド プロセスの強制終了による出力を抑制することができず、見つけたすべての解決策を試し ました。Bash Scripting を使用して、コマンドからのすべての出力を抑制するにはどうすればよいですか? -ここからのすべてのバリアントは機能しません。何をしても出力が得られます。$! を定義してみました。別の変数を使用して、/dev/null のすべてのバリアントを試し、trap コマンド内に配置しようとしましたが、役に立ちませんでした。
bash - bashでシグナルをトラップした後、メッセージを出力して続行する方法は?
これをbashでやりたい:
スクリプトを続行したいことを除いて、これは問題なく動作します。どうやってやるの?コマンドを空白文字列のままにしておくと、スクリプトは続行されますが、何も出力されません。メッセージの印刷と継続の両方を行うことはできますか?