如何从bash脚本发送Control + C?


Answers:


90

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

5
Per man kill如果未指定任何信号,则发送TERM信号,因此kill $PID不会发送SIGINT到进程,因此与Ctrl + C键盘事件不同
Alex

@Alex好抓住!我不相信有什么实际的区别,但是我可能是错的。
Matthieu Napoli

取决于命令,如果它已安装了SIGTERM或SIGINT的处理程序,则它可能会有所不同。不管怎么说,作为@paxdiablo说,使用kill -INTkill -SIGINTkill -2
domen 2013年

@domen对,我已经更新了答案,以便更精确。
Matthieu Napoli

取决于是否要将命令ctrl + c发送到其他进程作为输入。
j0h

14

CTRL-C 通常向进程发送SIGINT信号,因此您可以简单地执行以下操作:

kill -INT <processID>

从命令行(或脚本)开始,以影响特定的processID

我之所以说“一般”,是因为与大多数UNIX一样,这几乎是无限可配置的。如果执行stty -a,您可以看到哪个键序列与intr信号相关。可能是这样,CTRL-C但是键序列可能会完全映射到其他对象。


以下脚本显示了此操作的实际效果(尽管在我的环境中不会响应,因为TERM而不是):INTsleepINT

#!/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
===

我如何获得pid像tomcat之类的特定过程的信息
Manoj

2

ctrl+ckill -INT <pid>并不完全相同,要模拟ctrl+,c我们首先需要了解它们之间的区别。

kill -INT <pid>会将INT信号发送到给定的进程(通过找到pid)。

ctrl+c映射到intr特殊字符,该特殊字符在由终端接收时应发送INT到该终端的前台进程组。您可以通过定位给定的组来模拟这一点<pid>。可以通过-在kill命令中的信号之前添加a来完成。因此,您想要的命令是:

kill -INT -<pid>

您可以使用脚本轻松测试它:

#!/usr/bin/env ruby

fork {
    trap(:INT) {
        puts 'signal received in child!'
        exit
    }
    sleep 1_000
}

puts "run `kill -INT -#{Process.pid}` in any other terminal window."
Process.wait

资料来源:


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。对我来说工作正常。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.