web-dev-qa-db-ja.com

Linuxでプロセスを一時停止状態で開始するにはどうすればよいですか?

実際には、開始時にCtrl+Zを押したかのように動作するプロセスが必要です。

うまくいけば、シェルスクリプトを使用してそのようなことを行うことが可能です。

(また、結果のPIDがわかっていればすばらしいので、後でプロセスを続行できます。)

20

プロセスの開始後、SIGSTOPを送信して一時停止できます。再開するには、SIGCONTを送信します。この小さなスクリプトはあなたを助けるかもしれないと思います

#!/bin/bash
$@ &
PID=$!
kill -STOP $PID
echo $PID
wait $PID

プロセスを実行し(コマンドをパラメーターとして送信)、それを中断し、プロセスIDを出力し、プロセスが終了するまで待機します。

7
radious

どの環境からプロセスを作成していますか?

Cコードなどの環境から実行している場合は、fork()を実行してから、子でexec()の前にSIGSTOPを自分に送信して、それ以上実行されないようにすることができます。

より一般的な解決策(おそらく最良)は、そうするスタブを作成することです。したがって、スタブプログラムは次のようになります。

  • 実際のプログラムの名前と引数で構成される引数を取る
  • sIGSTOPを自分自身に送信する
  • exec()適切な引数を持つ実際のプログラム

これにより、信号を送信する前に、新しい処理が過度に行われることに関連するあらゆる種類の競合状態を回避できます。


シェルの例:

#!/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つしかない場合)。

複数の仕事でそれをやっていますか?読者のための演習として残しました:)

23
MikeyB

MikeyBの答えは正しいです。スーパーユーザーの この質問 から、これはより簡潔なバージョンです:

( kill -SIGSTOP $BASHPID; exec my_command ) &

これを理解するには、UNIXでプロセスがどのように開始されるかを理解する必要があります。execシステムコールは、現在実行中のプログラムを新しいものに置き換えます、既存のPIDを保持します。したがって、独立したプロセスを作成する方法は、最初にfork、次にexecとして、子プロセスで実行中のプログラムを目的のプログラムに置き換えます。

このシェルコマンドの構成要素は次のとおりです。

  1. 括弧(...)サブシェルを開始します:BASHの別のインスタンス。
  2. killコマンドは、STOPシグナルをこのプロセスに送信し、プロセスを中断状態にします。
  3. CONTシグナルを送信することにより)プロセスの続行を許可するとすぐに、execコマンドはそれを置き換えますご希望のプログラムで。 my_commandは、サブシェルの元のPIDを保持します。
  4. $!変数を使用して、プロセスのPIDを取得します。
20
nibot