我在一個bash腳本中啓動了一些屏幕,然後在其中的每一箇中運行django的runserver
命令。我希望能夠以編程方式停止它們,這要求我將Control+c
發送到runserver
。如何從bash腳本發送control + c?
如何從我的bash腳本發送這些擊鍵?
我在一個bash腳本中啓動了一些屏幕,然後在其中的每一箇中運行django的runserver
命令。我希望能夠以編程方式停止它們,這要求我將Control+c
發送到runserver
。如何從bash腳本發送control + c?
如何從我的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
每[男人殺'](http://linux.die.net/man/1/kill):如果沒有指定信號,則TERM信號被髮送,所以'kill $ PID'不向過程發送SIGINT,因此是不一樣的Ctrl + C鍵盤事件 – Alex 2013-04-03 18:48:48
@亞歷克斯好抓!我不相信有實際的區別,但我可能是錯的。 – 2013-04-03 20:56:07
取決於該命令,如果它已安裝SIGTERM或SIGINT處理程序,則可能會有所不同。無論如何,正如@paxdiablo所說,使用'kill -INT','kill -SIGINT'或'kill -2'。 – domen 2013-10-17 12:19:52
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
===
「從腳本」 – 2011-04-26 11:34:30
如何獲得特定進程的'pid',如tomcat – Manoj 2016-11-15 06:08:57
您可以通過使用以下命令獲得像MySQL特定進程的PID: PS -e | 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'將grep運行'firefox'的PID並將該PID保存到名爲'any_file_name'的文件中。 'sed'命令將在'any_file_name'文件的PID號開頭添加'kill'。第三行將使'any_file_name'文件成爲可執行文件。現在行將殺死文件'any_file_name'中可用的PID。將上述四行寫入文件並執行該文件可以實現control-C。對我來說工作絕對好。
另請參閱http://stackoverflow.com/questions/14696427/how-can-bash-script-do-the-equivalent-of-ctrl-c-to-a-background-task – tripleee 2016-09-26 14:25:11