問題タブ [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 - Bashスクリプトで終了コードをトラップする方法
私のbashコードには多くの出口点があります。出口でクリーンアップ作業を行う必要があるため、トラップを使用して、次のように出口のコールバックを追加しました。
問題は、さまざまな終了コードがあることです。対応するクリーンアップ作業を行う必要があります。mycleanupで終了コードを取得できますか?
bash - バックグラウンドシェルでSIGINTシグナルをトラップできません
子/バックグラウンドプロセスで実行しているときにシグナルをトラップできません。
これが私の簡単なbashスクリプトです:
これを実行し、後で実行する場合
すべてが期待どおりに機能し、印刷trapped
して終了します。
ここで、次のような親スクリプトから同じスクリプトを開始すると、次のようになります。
その後、子供はもう信号をトラップしません....?
SIGINTの代わりにSIGTERMを使用するように変更した後、正しく機能しているようです...?
bash - トラップハンドラーからbashで関数のバックトレースを取得します(呼び出し元を使用)
'caller'を使用して、bashで関数呼び出しのバックトレースを取得できることを知っています。
プリント:
私の質問は、チェックされていない失敗で終了するために「set-e」を使用するスクリプトがあるとしましょう。スクリプトが失敗した場所(およびその呼び出し元)の行番号を取得することは可能ですか?
私は素朴にやってみました:trap'Backtrace' EXIT、しかしそれは私に失敗したコマンドの行番号ではなく'1main./test.sh'を与えます
bash - SIGQUITをbashスクリプトで適切にトラップするにはどうすればよいですか?
うまくトラップするシェルスクリプトを書くことはできますが、トラップSIGINT
できないようですSIGQUIT
。
このスクリプトを実行して押すとCTRL-C
目的の効果が得られますが、押すCTRL-\
と(私が理解しているように、トリガーされるはずです) 、ターミナルでのSIGQUIT
印刷以外は何もしません。^\
なんで?
私には2つの実行理論があります。SIGINT
1つ目は、とのセマンティクスSIGQUIT
が異なり、子プロセスにSIGQUIT
のみ送信され、子プロセスと親bashプロセスの両方に送信されることです。この場合、どこに文書化されていますか?sleep
SIGINT
私の2番目の理論は、bashはデフォルトで(manページが示唆しているように)無視する(つまり、no-opハンドラーを持っているSIGQUIT
)だけでなく、トラップされることをまったく許可しないというものです。この理論は最初の理論と重複しています。これはSIGQUIT
、親と子の両方に当てはまる可能性があるためですが、親(bash
)はそれをトラップできません。この場合、 bashスクリプトをトラップする方法はありますSIGQUIT
か?...おそらくshopt
私が設定できるものはありますか?
編集:これは、bash4.1.5を実行しているgnome-terminal2.32.0のUbuntu10.10にあり、yesはSIGQUITを発行するように構成されています(SIGQUITを他のプログラムに発行すること^\
で報告stty -a
および確認されています)。^\
ping
更新:問題はどういうわけかgnome-terminalに起因しているに違いないことを発見しました。このスクリプトを仮想コンソールから実行すると(つまり、ctrl-alt-f1
Xから抜け出すために)、を押すとSIGQUITが完全にトラップされ^\
ます。同じbashとすべてなので、唯一の違いはターミナルエミュレーターでなければなりません。だから今私の質問は次のようになります:この点で仮想コンソールのように動作するようにgnome-terminalを構成するにはどうすればよいですか?仮想コンソールとgnome-terminalでdiff
の出力をstty -a
確認しました。違いはありますが、すぐに関連するものはないようです(たとえば、両方にquit = ^\;
)。
更新2:別の実験。$ sleep 60
gnome-terminalで実行するだけです。を押す^\
と、信号がキャッチされなくなります。$ sleep 60
次に、仮想コンソールで実行します。を押す^\
と、シグナルがキャッチされます。プロセスは印刷Quit
されて終了します。しかし、今度$ ping google.com
はgnome-terminalで実行し、^\
-を押します。信号がキャッチされ、期待どおりに処理されます。したがって、仮想コンソールから呼び出されたときに他のプログラムがSIGQUITをキャッチしたとしても、SIGQUITは一部のプログラムではキャッチできるが、他のプログラムではキャッチできないなど、gnome-terminalには奇妙なことがあります。おそらく、gnome-terminalをアップグレードする必要があります。
bash - トラップSIGCHLDを使用してbashサブプロセスを再起動しますか?
「ps」または「サービスステータス(Linuxの場合)」を使用してプロセスステータスを定期的にチェックするスクリプト、またはフォークしてプロセスを待機するC / C ++で監視プログラムを見てきました...
bash を trap で使用して、SIGCLD が受信されたときにサブプロセスを再起動することは可能でしょうか?
次のアイデアでRedHat Linuxで基本的なスイートをテストしました(そして確かに機能しませんでした...)
開始されたbashスクリプトは、数秒間スリープして、今のところ終了します。
いくつかの問題が観察されました:
- シェルがフォアグラウンドで起動すると、SIGCHLD は 1 回だけ処理されます。シグナル()のようなリセットシグナル処理をトラップしますか?
- スクリプトとその子は SIGINT の影響を受けないようです。つまり、^C で停止することはできません。
- 閉じることができないので、端末を閉じました。台本はHUPらしく、ゾンビの子がたくさん出てきました。
- バックグラウンドで実行すると、スクリプトにより端末が停止しました
...とにかく、これはまったく機能しません。私はこのトピックについてほとんど知らないと言わざるを得ません。誰かがいくつかの実例を提案または提供できますか? そのような使用のためのスクリプトはありますか?
では、bashでwaitを使用するのはどうですか?
ありがとう
bash - Ctrl-C(sigint)をbashにトラップするPerl
CTRL ^ C --Perl Monksをキャプチャする方法を読んでいますが、問題を解決するための適切な情報を取得できないようです。
重要なのは、無限ループがあり、ターミナルへの「マルチライン」プリントアウトです(代わりに使用するように指示されることは承知していますが、短いスクリプトの場合は、 sのncurses
束を書く方が快適ですprintf
)。Ctrl-Cをトラップして、この複数行の印刷が終了した後にのみスクリプトが終了するようにします。
スクリプトは(Ubuntu Linux 11.04)です:
これを実行してCtrl-Cを押すと、次のようになります(スクリプトが終了した後のターミナルカーソルの位置を示していることに注意してください_
)。
また:
...しかし、私は取得したい:
明らかに、ハンドラーは実行されていますが、期待するタイミング(または順序)ではありません。誰かがこれを修正する方法を明確にできるので、必要な出力を取得できますか?
よろしくお願いします。
bash - メインスクリプトを中断しないevalのBash、CTRL + C
私の bash スクリプトでは、$cmd
変数に格納されている外部コマンドを実行しています。(単純なbashワンライナーでさえ、何でもかまいません。)
ctrlスクリプトの実行中に+が押された場合C、現在実行中のスクリプトを強制終了したいのです$cmd
が、メイン スクリプトの実行を続行する必要があります。ctrlただし、メイン スクリプトの実行中に+でメイン スクリプトを強制終了するオプションを保持したいと考えていますC。
素敵なbashの方法でそれを行う方法はありますか?
回答に基づいて適用される変更:
では、 「おーっ1?」と言いながらctrl+を押して Cread は、その読み取りが完了した後にのみ評価を中断します。(「Oook2」の直前で中断します) ただし、「sleep 4」で即座に中断します。
どちらの場合でも、正しいことを行います-evalサブシェルを中断するだけなので、ほとんどそこにいます-ちょうどその奇妙な読み取り動作..
bash - 'trap'ブロックの宣言後に変更された変数を検出しないBashシグナルキャプチャ
特定のbashスクリプトが正常に終了したか中断されたかに関係なく、終了するたびに実行する必要のある一般的なクリーンアップコードがたくさんあります。これを実現するために疑似信号を使用すると思いましtrap "..." EXIT
た。
一般的なクリーンアップに加えて、スクリプトが正常に完了した場合にのみ実行する必要がある特定のクリーンアップも1つあります。'trap'ブロックに変数をテストさせることで、これをトリガーできると思いました。
ただし、これは機能しません。次のコードを実行しても、「テスト」がエコーされることはありません。exit
後に明示的な呼び出しを追加しても、done=true;
何も変更されません。私は何が欠けていますか?
乾杯!
bash - 引数を渡して関数をトラップしますか?
私はどこでも検索していて、グローバル変数を持つ以外にそれを行う方法はないと信じるようになりましたが、stackoverflow.comの第一人者が私を助けることができるかもしれないと信じています:
関数に引数を渡すことで関数をトラップする方法はbashにありますか?
たとえば、trap <function_name> <arg_1> <arg_2> SIGINT
?
bash - bashのトラップを使用して終了したバックグラウンドプロセスのpidをキャプチャします
いくつかのバックグラウンドプロセスを生成するbashスクリプトを書いています。プロセスが終了するたびに通知を受け取りたいのですが。終了したプロセスのpidを知りたいのですが。
wait
スポーンされた各プロセスのpidがキャプチャされて配列に格納され、配列が繰り返され、各プロセスで待機が呼び出されるように、を使用することを検討しました。この手法は、ここでさまざまな方法で説明されています。
https://stackoverflow.com/a/356154/366856
これに関する問題は、私が正しく理解していれば、個々のプロセスが終了したらすぐに何らかのアクションを実行したい場合、比較的非効率になる可能性があることです。たとえば、プロセスAとBを生成し、BがAの前に終了した場合、実行はAとBの両方が終了するのを待つ必要があります。Bが終了したらすぐにアクションを実行する必要があります。
子が終了したらすぐにアクションを実行する方法のようtrap SIGCHLD
ですが、問題は、SIGCHLD信号のソースのpidを判別する方法が見つからないことです。これも必要です。これの実用的な例に私が見つけた最も近いものは、この投稿の3番目のコード例です。
http://www.linuxforums.org/forum/programming-scripting/103996-multithreading-bash.html#post510187
便宜上、ここにコピーして貼り付けました。
この例はうまくいかないと思います。なぜなら、作成者は、引数trap
で異なるpid変数をキャプチャするたびに、何度も呼び出すという間違いを犯しているからです。trap
トラップが呼び出されるたびに、前の呼び出しが上書きされるため、任意のpidがキャプチャされます。私はより良いテクニックを見つけることができませんでした。
bashのトラップを使用して終了した子プロセスのpidを取得する方法はありますか?
アップデート
私はこのリソースを指摘したかっただけです。このリソースには、これまでに見たこの問題の解決策の最も包括的な概要が含まれています。