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

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

Linuxで新しいアプリケーション(テキストエディタなど)を起動し、「&」を使用することを忘れたとします。アプリケーションを閉じずにプロセスをバックグラウンドで実行するには、どのコマンドを使用しますか?これにより、2つのプロセスを開いて独立して作業することができます(たとえば、プロセスを作成するために使用されたコマンドライン端末とテキストエディタはまだ実行中です)。

答え1

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

たとえば、sleep コマンドを使用します。

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

プロセスが実行されていることがわかり、まだコマンドラインがあります。

答え2

Ctrl+Zはこれを行う方法ですが、完全性のために次のような「コマンド」を要求する質問です。これは(他の端末で)次のようになります。

kill -STOP pid_of_the_running_applications

そしてもちろん

bg

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

答え3

大きな打撃を受けた場合:

Ctrl+Zそれからbg

それでは、実行してjobs結果を確認してください。

答え4

CTRL- を押すという不快感を避けるための予防措置としてz、エディタがバックグラウンドで実行できるようにラッパースクリプトを生成できます。これにより、バックグラウンドで明示的に起動することを覚えておく必要はありません。

    #!/bin/sh

    EDITOR="emacs" # or whatever

    if [ -z "${DISPLAY}" ]; then
      ${EDITOR} "$@"
    else
      ${EDITOR} "$@" &
    fi

上記では、最初にエディタをバックグラウンドで実行する前に利用可能なXサーバーがあることを確認しようとします(そうでない場合は、多くのUnixエディタが端末を使用するため、この場合エディタをバックグラウンドプロセスとして実行したくありません)。 。"$@"ラッパースクリプトで指定したように、すべての引数を選択したエディタ()にそのまま渡します。

不足しているコマンドについて...私の基本的な実験では、ターミナルを含まないGUIプログラムの場合は、フォアグラウンドプロセスに送信するのと同じSIGSTOPくらい簡単です(シェルスクリプトを使用してこのコマンドを使用してください)。もちろん、他の端末ウィンドウ/タブで実行する必要がありますが、通常の方法で信号を送信したいPIDを簡単に見つけることは困難です。デフォルトでは、指定された名前を持つすべてのプロセスに2つのシグナルを送信できます(デフォルトは好みのエディタであり、PIDを引数として受け入れます)。SIGCONTkill

    #!/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します。fgbg

関連情報