サーチ…
現在のジョブを一覧表示する
$ 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
ではなくSIGTERM
でkill
コマンドを使用することを常にお勧めします。
バックグラウンドジョブを捨てる
$ gzip extremelylargefile.txt &
$ bg
$ disown %1
これにより、シェル(ターミナル、sshなど)が閉じられると、長時間実行されるプロセスが続行されます。