中間段階でCtrl + Cを送信した後でも、コマンドシーケンスを実行することはできますか?

中間段階でCtrl + Cを送信した後でも、コマンドシーケンスを実行することはできますか?

プログラムがありますが、それと呼びましょう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背景に戻すことができます。

関連情報