2011-04-26 49 views
44

我在一個bash腳本中啓動了一些屏幕,然後在其中的每一箇中運行django的runserver命令。我希望能夠以編程方式停止它們,這要求我將Control+c發送到runserver如何從bash腳本發送control + c?

如何從我的bash腳本發送這些擊鍵?

+0

另請參閱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

回答

57

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 
+3

每[男人殺'](http://linux.die.net/man/1/kill):如果沒有指定信號,則TERM信號被髮送,所以'kill $ PID'不向過程發送SIGINT,因此是不一樣的Ctrl + C鍵盤事件 – Alex 2013-04-03 18:48:48

+0

@亞歷克斯好抓!我不相信有實際的區別,但我可能是錯的。 – 2013-04-03 20:56:07

+0

取決於該命令,如果它已安裝SIGTERM或SIGINT處理程序,則可能會有所不同。無論如何,正如@paxdiablo所說,使用'kill -INT','kill -SIGINT'或'kill -2'。 – domen 2013-10-17 12:19:52

11

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 
=== 
+0

「從腳本」 – 2011-04-26 11:34:30

+0

如何獲得特定進程的'pid',如tomcat – Manoj 2016-11-15 06:08:57

0

您可以通過使用以下命令獲得像MySQL特定進程的PID: PS -e | pgrep mysql

這個命令會給你MySQL操作系統的PID。例如,13954 現在,在終端上鍵入以下命令。 kill -9 13954 這會殺死MySQL的進程。

0
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。對我來說工作絕對好。