web-dev-qa-db-ja.com

「&」なしのバックグラウンドでのプロセス

Linuxで新しいアプリケーション(テキストエディターなど)を開始したが、「&」を使用するのを忘れたとします。そのアプリケーションを閉じる必要がない一方で、そのプロセスをバックグラウンドで実行するためにどのコマンドを使用しますか?このようにして、両方のプロセスを開いて別々に動作させることができます(たとえば、プロセスの作成に使用したコマンドラインターミナルや、テキストエディターなどのプロセスはまだ実行中です。

24
D0uble7

ターミナルウィンドウで、通常は次のように入力します。 Control+Z プロセスを「一時停止」し、bgコマンドを使用してプロセスを「バックグラウンド」にします。

例:スリープコマンド

$ /bin/sleep 1000
^Z[1] + Stopped                  /bin/sleep 1000
$ bg
[1]     /bin/sleep 1000&
$ jobs
[1] +  Running                 /bin/sleep 1000
$ 

プロセスが実行中であることを確認できますが、まだコマンドラインがあります。

43
Stephen Harris

Ctrl+Z それはそれを行う方法ですが、完全を期すためです:質問は「コマンド」を要求し、それは(別の端末から)です:

kill -STOP pid_of_the_running_applications

そしてもちろん

bg

アプリケーション端末から。

14

バッシュで:

Ctrl+Z そしてbg

jobsを実行して結果を確認します。

10
user147505

押さなければならないという不便さの予防策として 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コマンドに関連するその他の必要な操作を処理するのは、シェルジョブ制御ロジックです。

1
FooF