Linuxで新しいアプリケーション(テキストエディターなど)を開始したが、「&」を使用するのを忘れたとします。そのアプリケーションを閉じる必要がない一方で、そのプロセスをバックグラウンドで実行するためにどのコマンドを使用しますか?このようにして、両方のプロセスを開いて別々に動作させることができます(たとえば、プロセスの作成に使用したコマンドラインターミナルや、テキストエディターなどのプロセスはまだ実行中です。
ターミナルウィンドウで、通常は次のように入力します。 Control+Z プロセスを「一時停止」し、bg
コマンドを使用してプロセスを「バックグラウンド」にします。
例:スリープコマンド
$ /bin/sleep 1000
^Z[1] + Stopped /bin/sleep 1000
$ bg
[1] /bin/sleep 1000&
$ jobs
[1] + Running /bin/sleep 1000
$
プロセスが実行中であることを確認できますが、まだコマンドラインがあります。
Ctrl+Z それはそれを行う方法ですが、完全を期すためです:質問は「コマンド」を要求し、それは(別の端末から)です:
kill -STOP pid_of_the_running_applications
そしてもちろん
bg
アプリケーション端末から。
バッシュで:
Ctrl+Z そしてbg
。
jobs
を実行して結果を確認します。
押さなければならないという不便さの予防策として CTRL-z、バックグラウンドでエディターを実行するエディター用のラッパースクリプトを作成できます。これにより、バックグラウンドで明示的に開始することを覚えておく必要がなくなります。
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
上記では、最初にXサーバーが利用可能かどうかを判断し、その後、エディターをバックグラウンドで実行します(そうでない場合、多くのUnixエディターは代わりにターミナルを使用し、この場合、エディターをバックグラウンドプロセスとして実行しません)。 。選択したエディターにすべての引数をそのまま渡します("$@"
)ラッパースクリプトに指定したのと同じです。
コマンドについては、不足しています...私の基本的な実験によれば、ターミナルを含まないGUIプログラムの場合、最初にSIGSTOP
を送信し、次にSIGCONT
をフォアグラウンドプロセスに送信するだけの簡単な方法です。 (シェルスクリプトを使用してこれを実装する場合はkill
コマンドを使用)。もちろん、それを別のターミナルウィンドウ/タブで実行する必要がありますが、信号を送信するPIDを簡単かつ一般的な方法で見つけるのは困難です。デフォルトでは、指定された名前のすべてのプロセスに2つの信号を送信できます(デフォルトでお気に入りのエディターになり、引数としてPIDを使用することもできます)。
#!/bin/sh
EDITOR=emacs # whatever
stop_cont_prog()
{
case "$1" in
# begin with number is considered PID - this is not good
# enough to be taken seriously...
[1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
*) killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
esac
}
if [ -n "$1" ]; then
for prog in "$@"; do stop_cont_prog "$1"; done
else
stop_cont_prog "${EDITOR}"
fi
この方法では、バックグラウンドで(いくつかの)emacs
コマンドを実行した後、端末タブが正しく表示されました。しかし、ターミナルで実行されているemacsプロセスは、シェルジョブ制御またはターミナル設定の混乱のために適切に復元されませんでした。したがって、この方法はいくつかの洗練化から利益を得るでしょう。
SIGSTOP
は、押したときにフォアグラウンドプロセスに送信されるものです(一般的なデフォルト)。 CTRL-z。参照する stty -a
出力
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(省略された出力)およびstty
マニュアルページ:
susp CHAR
CHAR will send a terminal stop signal
SIGSTOP
シグナルを使用して停止したプロセスは、SIGCONT
を送信することで再開できます。通常、SIGCONT
を送信し、無視するfg
およびbg
コマンドに関連するその他の必要な操作を処理するのは、シェルジョブ制御ロジックです。