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


24

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


技術的にではありませんが、おそらくtmuxあなたの質問で望まれるのと同じ機能を提供します。
mkc

1
可能な場合は、別のシェルを開くという単純な代替案を見逃さないでください。
jpmc26

回答:


43

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

例:スリープコマンド

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

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


5
fgコマンドを使用してプロセスをフォアグラウンドに戻すことができます。このコマンドは、ジョブID(1この場合は括弧で指定)をパラメーターとして受け取ります。の使用に固有のものではなく、でbg起動されたプロセスで実行できます&
アーロン

14

Ctrl+ Zはそれを行う方法ですが、完全を期すために:「コマンド」を尋ねる質問は、(別の端末から)次のようになります。

kill -STOP pid_of_the_running_applications

そしてもちろん

bg

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


6
キル
ミシェル

10

Bashの場合:

Ctrl+Zその後bg

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


2
@grooveplex Tomasが最初に答えたので、Stephenの答えの下にコメントする方が適切でしょう。
アントン

2
実際に同時に答えました。当たり前の答えだから、私たち二人とも同じことを言ったのは驚くことではない:-) サンプルの作成とフォーマットに余分な時間を費やしたため、トーマスのすぐ後に私の答えが届きました。
スティーブンハリス

1
そして、私はそれがBashにあると言うので、彼らは同じではありません。
トマス

1
へえ、そこに潜在的なポイントがあります。シェルがジョブを制御する必要があります。私が取り組んだ最初のマシンの一部(SVr2ベース)にはそれがなかった/bin/shため、これは機能しませんでした:
Stephen Harris

1

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- zstty -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コマンドを送信し、処理します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.