実際には、Ctrl+Z
開始直後に押すように動作するプロセスが必要です。
うまくいけば、シェルスクリプトを使用してそのようなことを行うことが可能です。
(また、結果のPIDを知ることは素晴らしいことなので、その後もプロセスを続行できます。)
実際には、Ctrl+Z
開始直後に押すように動作するプロセスが必要です。
うまくいけば、シェルスクリプトを使用してそのようなことを行うことが可能です。
(また、結果のPIDを知ることは素晴らしいことなので、その後もプロセスを続行できます。)
回答:
プロセスを開始した後、SIGSTOPを送信して中断することができます。再開するには、SIGCONTを送信します。この小さなスクリプトがあなたを助けるかもしれないと思います
#!/bin/bash
$@ &
PID=$!
kill -STOP $PID
echo $PID
wait $PID
プロセスを実行し(コマンドをパラメーターとして送信)、プロセスを一時停止し、プロセスIDを出力して、終了するまで待機します。
どの環境からプロセスを作成していますか?
Cコードなどの環境から実行している場合は、fork()を実行してから、子でexec()の前に自分にSIGSTOPを送信し、それ以上実行できないようにします。
より一般的なソリューション(おそらく最良)は、そうするスタブを作成することです。したがって、スタブプログラムは次のようになります。
これにより、シグナルを送信する前に新しい処理が過度に行われることに関係する、あらゆる種類の競合状態を回避できます。
シェルの例:
#!/bin/bash
kill -STOP $$
exec "$@"
上記のcodezを使用して:
michael@challenger:~$ ./stopcall.sh ls -al stopcall.sh
[1]+ Stopped ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$ jobs -l
[1]+ 23143 Stopped (signal) ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$ kill -CONT 23143; sleep 1
-rwxr-xr-x 1 michael users 36 2011-07-24 22:48 stopcall.sh
[1]+ Done ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$
jobs -l
PIDを示しています。ただし、シェルから実行する場合は、PIDを直接必要としません。次のことができます:(kill -CONT %1
ジョブが1つしかない場合)。
複数の仕事でそれをしますか?読者のための演習として残した:)
MikeyBの答えは正しいです。スーパーユーザーに関するこの質問から、より簡潔なバージョンを以下に示します。
( kill -SIGSTOP $BASHPID; exec my_command ) &
これを理解するには、unix上でプロセスがどのように開始されるかを理解する必要があります。exec
システムコールは、現在実行中のプログラムを新しいものに置き換え、既存のPIDを保持します。したがって、独立したプロセスを作成する方法は、最初fork
に、次にexec
、子プロセスで実行中のプログラムを目的のプログラムに置き換えることです。
このシェルコマンドの構成要素は次のとおりです。
(...)
開始します:BASHの別のインスタンス。kill
コマンドは、このプロセスにSTOPシグナルを送信し、プロセスを一時停止状態にします。CONT
シグナルを送信することにより)プロセスの続行を許可するとすぐに、exec
コマンドにより、目的のプログラムに置き換えられます。 my_command
サブシェルの元のPIDを保持します。$!
変数を使用して、プロセスのPIDを取得できます。-s STOP
代わりに使用しなければならなかったということです-SIGSTOP
)。まだ不思議です:なぜそれの$BASHPID
代わりになければならないの$$
ですか?(違いを本当に理解していないかもしれません)。
$$
対$BASHPID
、私は前者はないが、後者は、サブシェルのPIDであるチェック。面白い問題があります:bashスクリプトにヒントを適用すると、ほとんどの場合失敗し、次のようなPID=$!; ps -p $PID; kill -s CONT $PID;
ことをしなければなりません:... ps -p $PID
パーツを削除すると失敗します。 。対話型シェルからでも問題ありません。問題はスクリプトからのみです。それはあまりにも神秘的です。
#!/bin/bash
[enter]$@ &
[enter]PID=$!
[enter]kill -STOP $PID
[enter]echo "Suspended: $PID, press ENTER to continue it"
[enter]read
[enter]kill -CONT $PID
[enter]wait $PID
[enter]echo