2011-04-26 83 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。对我来说工作绝对好。