Bashスクリプトでいくつかの画面を起動し、それぞれでDjangoのrunserver
コマンドを実行しています。すべてをプログラムで停止できるようにしたいので、Control+c
からrunserver
へ。
これらのキーストロークをbashスクリプトから送信するにはどうすればよいですか?
Ctrl+C SIGINT
信号を送信します。
kill -INT <pid>
はSIGINT
信号も送信します。
# Terminates the program (like Ctrl+C)
kill -INT 888
# Force kill
kill -9 888
888
がプロセスIDであると仮定します。
kill 888
はSIGTERM
シグナルを送信しますが、これはわずかに異なりますが、プログラムの停止を要求することに注意してください。そのため、何をしているのかがわかっている場合(プログラムでSIGINT
にバインドされたハンドラーがない場合)、単純なkill
で十分です。
スクリプトで最後に起動したコマンドのPIDを取得するには、$!
を使用します。
# Launch script in background
./my_script.sh &
# Get its PID
PID=$!
# Wait for 2 seconds
sleep 2
# Kill it
kill $PID
CTRL-C 通常、プロセスにSIGINTシグナルを送信するため、次のことが簡単にできます。
kill -INT <processID>
コマンドライン(またはスクリプト)から、特定のprocessID
に影響を与えます。
「一般に」と言うのは、ほとんどのUNIXと同様に、これはほぼ無限に設定可能であるためです。 stty -a
を実行すると、intr
シグナルに関連付けられているキーシーケンスを確認できます。これはおそらく CTRL-C しかし、そのキーシーケンスは他の何かに完全にマッピングされます。
次のスクリプトはこれを実際に示しています(私の環境ではTERM
はINT
に反応しないため、sleep
ではなくINT
を使用しています)。
#!/usr/bin/env bash
sleep 3600 &
pid=$!
sleep 5
echo ===
echo PID is $pid, before kill:
ps -ef | grep -E "PPID|$pid" | sed 's/^/ /'
echo ===
( kill -TERM $pid ) 2>&1
sleep 5
echo ===
echo PID is $pid, after kill:
ps -ef | grep -E "PPID|$pid" | sed 's/^/ /'
echo ===
基本的には、時間ログsleep
プロセスを開始し、そのプロセスIDを取得します。次に、プロセスを強制終了する前に、関連するプロセスの詳細を出力します。
少し待ってから、プロセステーブルをチェックして、プロセスが終了したかどうかを確認します。スクリプトの出力からわかるように、実際には消えています。
===
PID is 28380, before kill:
UID PID PPID TTY STIME COMMAND
pax 28380 24652 tty42 09:26:49 /bin/sleep
===
./qq.sh: line 12: 28380 Terminated sleep 3600
===
PID is 28380, after kill:
UID PID PPID TTY STIME COMMAND
===
次のコマンドを使用して、MySQLのような特定のプロセスのPIDを取得できます。 pgrep mysql
このコマンドは、MySQLプロセスのPIDを提供します。例:13954ここで、ターミナルで次のコマンドを入力します。 kill -9 13954これにより、MySQLのプロセスが強制終了されます。
pgrep -f process_name > any_file_name
sed -i 's/^/kill /' any_file_name
chmod 777 any_file_name
./any_file_name
たとえば、「pgrep -f firefox」は、実行中の「firefox」のPIDをgrepし、「any_file_name」というファイルにこのPIDを保存します。 「sed」コマンドは、「any_file_name」ファイルのPID番号の先頭に「kill」を追加します。 3行目は「any_file_name」ファイルを実行可能にします。ここで4行目は、「any_file_name」ファイルで使用可能なPIDを強制終了します。上記の4行をファイルに書き込み、そのファイルを実行すると、control-Cを実行できます。私にとってはまったく問題ありません。