我正在用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而不是):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之类的特定过程的信息
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。对我来说工作正常。