我正在用bash脚本启动多个屏幕,然后runserver
在每个屏幕中运行django的命令。我也希望能够通过编程方式将其全部停止,这需要我发送Control+c
至runserver
。
如何从bash脚本发送这些击键?
Answers:
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
kill -INT
,kill -SIGINT
或kill -2
。
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
===
pid
像tomcat之类的特定过程的信息
ctrl+c和kill -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
资料来源:
您可以使用以下命令来获取特定进程(如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。对我来说工作正常。