如何从bash脚本发送control + c?

我在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一样,这是几乎无限可configuration的。 如果执行stty -a ,则可以看到哪个键序列与intr信号绑定。 这可能是CTRL-C,但该键序列可能完全映射到其他的东西。


以下脚本显示了这一点(尽pipeTERM而不是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:ps -e | pgrep mysql

这个命令会给你MySQL的进程的PID。 例如,13954现在,在terminal上input以下命令。 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。 为我工作绝对好。