私はhelp suspend
と入力して、この短い説明を得ました:
suspend: suspend [-f]
Suspend Shell execution.
Suspend the execution of this Shell until it receives a SIGCONT signal.
Unless forced, login shells cannot be suspended.
Options:
-f force the suspend, even if the Shell is a login Shell
Exit Status:
Returns success unless job control is not enabled or an error occurs.
これを理解するには:suspend
と入力すると、ターミナルがフリーズします。strg+ cでもフリーズを解除できません。しかし、別のターミナルを開いて凍結されたもののPIDを検索し、kill -SIGCONT PID-NR
と入力すると、凍結されたターミナルにSIGCONT信号が送信され、解凍されて凍結されなくなります。
しかし、端末を一時停止する実際の目的は何ですか?毎日のアプリケーションはどれが典型的ですか?シェルを組み込みにした人々は何を考えていましたか?
別のシェルからシェルを起動する場合は、内側のシェルを一時停止できます。 su
を使用していて、しばらくの間通常のユーザーに切り替えたい場合は次のようにします。
user$ su
Password: ...
root# do something
root# suspend
user$ do something as the ordinary user again
user$ fg
root# ...
(これを行う場合は、特権シェルがバックグラウンドで開いていることを忘れないでください...)
同様に、他のプログラム(!
コマンド。 less
)、シェルを一時停止できます。しかし、他の多くのプログラムがサブプロセスを起動し、それがそれ自体を中断するとき、それをうまく処理することを期待しません。
それは押すのと同じです Ctrl+Z 他のコマンドで。
シェルを一時停止し、親シェルまたはプロセスがあればプロセスに制御を戻します。
例:
zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal) bash
zsh$ fg
[1] + continued bash
bash-4.4$ pwd
/
この機能は、80年代前半のcsh、BSDのシェル(ジョブ制御の由来) に由来します 。
AT&T ksh
では、これはkill -s STOP $$
の組み込みエイリアスです( はい、引用符はありません! )
あなたの場合、bash
はおそらくターミナルエミュレーターによって直接開始されたものです。また、ターミナルエミュレータは、プロセスが中断されることを予期していませんでした。
そのbash
はセッションリーダーでした。セッションリーダーが一時停止されている場合、旧式の端末を見ると、ユーザーはそれを再開する方法がありません。
bash
は、ログインシェルの場合はsuspend
を拒否することで対処します。しかし、あなたのケースでは、端末エミュレータはおそらくログインモードでbash
を起動しないため、安全対策が講じられていません。
zsh
とmksh
はSIGTSTP
(これも Ctrl+Z)SIGSTOP
の代わりにcshのようなシグナル(およびcshのようにmksh
の呼び出し元のプロセスグループに、_zsh
のシェルのメインプロセスグループに、$$
ではなくプロセスのみ)。孤立したプロセスグループに配信された場合、SIGTSTP
は無視され、リーダーのグループが対象となります。 SIGTSTPは、ユーザーが再開できないものを一時停止してはならないという考え方です。
mksh
またはyash
では、suspend
を使用してサブシェル自体を一時停止することもできます。
$ (set -x; sleep 1; suspend; sleep 2)
+ sleep 1
+ suspend
[1] + Stopped(SIGSTOP) (set -x; sleep 1; suspend; sleep 2)
$ fg
[1] (set -x; sleep 1; suspend; sleep 2)
+ sleep 2
これは、SIGTSTPを呼び出し元ではなくメインプロセスグループに送信するzsh
では機能しません。 kill
が組み込まれているシェルでは、代わりに常にkill -s TSTP 0
を使用できます。