Bashでsuspendコマンドを使用する実用的な例は何ですか?


12

suspendBashの組み込みコマンドです。いつこのコマンドを自然に使用し、便利だと思いますか?


1
シェル、すなわちコマンドが必要、外部のプログラムであることを特徴とするコマンド実行し、自身がそれが子プロセスをフォーク毎回一時停止しfork/exec、システムコールを
the_velour_fog

1
対話型シェルでは、これにより子プロセスが端末を制御できるようになりますが、親シェルが端末と対話することはありません。
-the_velour_fog

2
@velourですが、そのために別のコマンドを実行する必要はありませんか?
-ilkkachu

@the_velour_fog技術的には、親STOPプロセスは子プロセスをフォークするときに中断されません(シグナルを受信しません)。また、2番目のコメントにも少し混乱しています。
クサラナナンダ

1
@Kusalanandaわかりました、wait()私にとっては正しいと思います。私は、シェルが子プロセスをフォークするたびにシェルがそれ自体を一時停止すると言いました。停止信号の受信については何も言わなかったが、それは意味をなさないだろう。
-the_velour_fog

回答:


14

GNU screentmux(およびX11 仮想コンソール)の両方が不足しているが、ログインシェルと別のインタラクティブシェルを切り替えたいとします。

最初にコンソールにログインし、次に新しいシェルを起動して、ログインシェルを一時的にブロックします。そこでログインシェルに戻って作業を行うには、を実行しますsuspend。その後fg、インタラクティブシェルを元に戻し、そこで行ったことを続行します。

実際、ジョブ制御を使用すると、ログインシェルはfg %1fg %2などで切り替えることができるバックグラウンドジョブとして多数のインタラクティブシェルを生成できますが、ログインシェルに戻るには、suspend手動で使用する場合を除き、使用する必要がありますkill -s STOP $$

また、対話型シェルのプロンプトでCtrl+を指定Zしても、中断されないことに注意してください。

編集:私は当初suspend、スクリプトでの使用に関する長い仮説セクションを持っていましたが、コマンドにはジョブ制御が必要であり、非対話型シェルには通常ジョブ制御がないため、そのセクションを削除しました。


suspend置き換えられたセクションを削除しましたkill -s STOP $$(これは実際には回答に属していませんが、とにかく他の人にとって興味深いかもしれません):

スクリプトにバックグラウンドプロセス(スクリプト)があり、このバックグラウンドプロセスがある段階で停止し、親プロセスが処理を続行するのを待つ必要があるとします。これにより、親がファイルを抽出して所定の場所などに移動する時間を確保できます。

子スクリプトは一時停止(kill -s STOP $$)し、親スクリプトはCONT続行してもよいときにシグナルを送信します。

親プロセスと子プロセスの間に一種の同期を実装する機会を提供します(ただし、親シェルプロセスは多かれ少なかれ子プロセスが一時停止していることを推測する必要があるため、これは子を持つことで修正できますが、CONTその信号があまりにも早く受信された場合、トラップしてサスペンドしない)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.