サーチ…


現在のジョブを一覧表示する

$ tail -f /var/log/syslog > log.txt
[1]+  Stopped                 tail -f /var/log/syslog > log.txt

$ sleep 10 &

$ jobs
[1]+  Stopped                 tail -f /var/log/syslog > log.txt
[2]-  Running                 sleep 10 &

ジョブ処理

ジョブの作成

ジョブを作成するには、コマンドの後ろに&を1つだけ追加します:

$ sleep 10 &
[1] 20024

Ctrl + z キーを押して、実行中のプロセスをジョブにすることもできます。

$ sleep 10
^Z
[1]+  Stopped                 sleep 10

プロセスのバックグラウンドとフォアグラウンド

プロセスをフォアグラウンドにするには、コマンドfg%

$ sleep 10 &
[1] 20024

$ fg %1
sleep 10

これでプロセスと対話できます。バックグラウンドに戻すには、 bgコマンドを使用します。占有されている端末セッションのために、まずCtrl + zを押してプロセスを停止する必要があります。

$ sleep 10
^Z
[1]+  Stopped              sleep 10

$ bg %1
[1]+ sleep 10 &

一部のプログラマの怠惰のため、これらのコマンドはすべて、プロセスが1つだけの場合は1つの%で、リストの最初のプロセスでは機能します。例えば:

$ sleep 10 &
[1] 20024

$ fg %        # to bring a process to foreground 'fg %' is also working.
sleep 10

あるいは単に

$ %           # laziness knows no boundaries, '%' is also working.
sleep 10

さらに、引数なしでfgまたはbgを入力するだけで、最後のジョブが処理されます。

$ sleep 20 &
$ sleep 10 &
$ fg
sleep 10
^C
$ fg
sleep 20

実行中のジョブを強制終了する

$ sleep 10 &
[1] 20024

$ kill %1
[1]+  Terminated              sleep 10

スリーププロセスは、プロセスID(pid) 20024とジョブ番号1のバックグラウンドで実行されます。プロセスを参照するには、pidまたはジョブ番号のいずれかを使用できます。ジョブ番号を使用する場合は、接頭辞として%付ける必要があります。 killによって送信されるデフォルトのkillシグナルはSIGTERM 。これにより、ターゲットプロセスを正常に終了さkillができます。

いくつかの一般的なkillシグナルを以下に示します。完全なリストを表示するには、 kill -l実行します。

信号名信号値効果
SIGHUP 1 電話を切る
SIGINT 2 キーボードからの割り込み
SIGKILL 9 キル信号
SIGTERM 15 終了信号

特定のプロセスを開始して終了させる

実行中のプロセスを殺すのおそらく最も簡単な方法は、使用して、次の例のように、プロセス名を通してそれを選択することであるpkill 、コマンドなどを

pkill -f test.py

(または)実際のプロセスIDを検索するためにpgrepを使用するより馬鹿な方法

kill $(pgrep -f 'python test.py')

grep over ps -ef | grep name_of_process grepを使っても同じ結果が得られますps -ef | grep name_of_processを実行し、結果のpid(プロセスID)に関連付けられたプロセスを強制終了します。テスト環境では名前を使用してプロセスを選択するのは便利ですが、実際にスクリプトをプロダクションで使用すると危険です。実際に殺すプロセスと名前が一致することは事実上不可能です。そのような場合、次のアプローチは実際には非常に安全です。

最終的に次の方法で終了するスクリプトを開始します。実行して最終的にkillしたいコマンドがpython test.pyだとしましょう。

#!/bin/bash

if [[ ! -e /tmp/test.py.pid ]]; then   # Check if the file already exists
    python test.py &                   #+and if so do not run another process.
    echo $! > /tmp/test.py.pid
else
    echo -n "ERROR: The process is already running with pid "
    cat /tmp/test.py.pid
    echo
fi

これは、 /tmpディレクトリに、 python test.pyプロセスのpidを含むファイルを作成します。ファイルがすでに存在する場合は、コマンドがすでに実行されており、スクリプトがエラーを返すものと想定します。

次に、それを殺すには、次のスクリプトを使用します。

#!/bin/bash

if [[ -e /tmp/test.py.pid ]]; then   # If the file do not exists, then the
    kill `cat /tmp/test.py.pid`      #+the process is not running. Useless
    rm /tmp/test.py.pid              #+trying to kill it.
else
    echo "test.py is not running"
fi

(コマンドを実行するために使用された文字列のような)揮発性の情報に頼ることなく、コマンドに関連するプロセスを正確に停止します。この場合でも、ファイルが存在しない場合は、実行されていないプロセスを強制終了することをスクリプトは想定しています。

この最後の例は、同じコマンドを複数回実行する(pidファイルを上書きするのではなくpidファイルに追加する)こと、およびプロセスが終了する前に死に至るケースを管理するために簡単に改善できます。

すべてのプロセスを一覧表示する

システム上のすべてのプロセスをリストする一般的な方法は2つあります。両方とも、すべてのユーザーが実行しているすべてのプロセスを一覧表示しますが、出力される形式が異なります(相違点の理由は履歴です)。

ps -ef   # lists all processes 
ps aux   # lists all processes in alternative format (BSD)

これは、特定のアプリケーションが実行されているかどうかを確認するために使用できます。たとえば、SSHサーバー(sshd)が実行されているかどうかを確認するには、次のようにします。

ps -ef | grep sshd

特定のポートで実行されているプロセスを確認する

ポート8080で実行中のプロセスを確認するには

lsof -i :8080

実行中のプロセスに関する情報の検索

ps aux | grep <search-term>は、 検索語句と一致するプロセスを表示します

例:

root@server7:~# ps aux | grep nginx
root       315  0.0  0.3 144392  1020 ?        Ss   May28   0:00 nginx: master process /usr/sbin/nginx
www-data  5647  0.0  1.1 145124  3048 ?        S    Jul18   2:53 nginx: worker process
www-data  5648  0.0  0.1 144392   376 ?        S    Jul18   0:00 nginx: cache manager process
root     13134  0.0  0.3   4960   920 pts/0    S+   14:33   0:00 grep --color=auto nginx
root@server7:~#

ここで、2番目の列はプロセスIDです。たとえば、nginxプロセスを強制終了したい場合は、コマンドkill 5647使用できます。 SIGKILLではなくSIGTERMkillコマンドを使用することを常にお勧めします。

バックグラウンドジョブを捨てる

$ gzip extremelylargefile.txt &
$ bg
$ disown %1

これにより、シェル(ターミナル、sshなど)が閉じられると、長時間実行されるプロセスが続行されます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow