web-dev-qa-db-ja.com

bashスクリプトからcontrol + cを送信する方法は?

Bashスクリプトでいくつかの画面を起動し、それぞれでDjangoのrunserverコマンドを実行しています。すべてをプログラムで停止できるようにしたいので、Control+cからrunserverへ。

これらのキーストロークをbashスクリプトから送信するにはどうすればよいですか?

54
ghickman

Ctrl+C SIGINT信号を送信します。

kill -INT <pid>SIGINT信号も送信します。

# Terminates the program (like Ctrl+C)
kill -INT 888
# Force kill
kill -9 888

888がプロセスIDであると仮定します。


kill 888SIGTERMシグナルを送信しますが、これはわずかに異なりますが、プログラムの停止を要求することに注意してください。そのため、何をしているのかがわかっている場合(プログラムでSIGINTにバインドされたハンドラーがない場合)、単純なkillで十分です。

スクリプトで最後に起動したコマンドのPIDを取得するには、$!を使用します。

# Launch script in background
./my_script.sh &
# Get its PID
PID=$!
# Wait for 2 seconds
sleep 2
# Kill it
kill $PID
69
Matthieu Napoli

CTRL-C 通常、プロセスにSIGINTシグナルを送信するため、次のことが簡単にできます。

kill -INT <processID>

コマンドライン(またはスクリプト)から、特定のprocessIDに影響を与えます。

「一般に」と言うのは、ほとんどのUNIXと同様に、これはほぼ無限に設定可能であるためです。 stty -aを実行すると、intrシグナルに関連付けられているキーシーケンスを確認できます。これはおそらく CTRL-C しかし、そのキーシーケンスは他の何かに完全にマッピングされます。


次のスクリプトはこれを実際に示しています(私の環境ではTERMINTに反応しないため、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
===
12
paxdiablo

次のコマンドを使用して、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を実行できます。私にとってはまったく問題ありません。

0
user2176228