プログラムがありますが、それと呼びましょうxcommand
。実行すると標準出力はありませんが、出力をファイルに書き込みます。
私が達成したいのは、実行後のxcommand
実行プロセス中にリアルタイムで出力を見たいと思います。例外が見つかったら、出力を閉じて同時に復元しますxcommand
。
たとえば、私が書いたbashスクリプトでいくつかの方法を試しました。
xcommand &
tail -f outputfile
fg
しかし、問題は、を押すとctrl+c
すべてが停止することです。そしてfg
まったく実行されていません。
それで、私が望む効果を得ることができますか?
答え1
非対話型(スクリプトなど)の場合、シェルはジョブ制御を実行しません。非同期操作をバックグラウンドに置かないでください。これらはスクリプトの残りの部分と同じプロセスグループに残るため、Ctrl-Cを押すとSIGINTがそのプロセスグループに送信されます(スクリプト自体がフォアグラウンドで実行されていると仮定)。
set -m
シェルに非対話型ジョブ制御を提供するコマンドを実行できます。
#! /bin/bash -
set -m
xcommand & # start as a background job, so won't receive SIGINT upon ^C
tail -f outputfile # start in foreground. Will receive SIGINT.
fg # bring the xcommand job in foreground and wait for it. Will receive SIGINT
機能するには、スクリプトを前景から開始する必要があります。また、Ctrl-Z を押すか、バックグラウンド ジョブが端末からデータを読み取ろうとすると、問題が発生することがあります。
私の経験では、この技術は「働く」bash
または、yash
通常、他のBourneと同じシェルではありません。
答え2
バックグラウンドでプログラムを起動すると
xcommand &
Ctrl+C殻を押していいえ止まる
そうすれば
tail -f outputfile
Ctrl+Cその後、押すとtail
プロセスが終了します。
そうすれば
fg
xcommand
前景に配置します。これで押すとプロセスCtrl+Cが終了しますxcommand
。
したがって、プロセスを前景にインポートしないでくださいxcommand
。もしそうなら、それを押しCtrl+Z続けるとbg
背景に戻すことができます。