如何发送控件+;来自bash脚本的c?

如何发送控件+;来自bash脚本的c?,bash,gnu-screen,Bash,Gnu Screen,我在bash脚本中启动了许多屏幕,然后在每个屏幕中运行django的runserver命令。我希望能够以编程方式停止它们,这需要我将Control+c发送到runserver 如何从bash脚本发送这些击键?Ctrl+C发送一个SIGINT信号 kill-INT也发送一个SIGINT信号: # Terminates the program (like Ctrl+C) kill -INT 888 # Force kill kill -9 888 假设888是您的进程ID 请注意,kill 88

我在bash脚本中启动了许多屏幕,然后在每个屏幕中运行django的
runserver
命令。我希望能够以编程方式停止它们,这需要我将
Control+c
发送到
runserver

如何从bash脚本发送这些击键?

Ctrl+C发送一个
SIGINT
信号

kill-INT
也发送一个
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>
它基本上启动一个小时日志
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。e、 g,13954 现在,在终端上键入以下命令。 kill-913954 这将终止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。对我来说,工作绝对正常。

ctrl+C和
kill-INT
并不完全相同 要模拟ctrl+c,我们首先需要了解其区别

kill-INT
将向给定进程发送
INT
信号(通过其
pid
找到)

ctrl+c被映射到
intr
特殊字符,当终端接收到该字符时,该字符应将
INT
发送到该终端的前台进程组。您可以通过以给定的
组为目标来模拟这一点。可以通过在kill命令中的信号前面加上一个
-
来完成。因此,您需要的命令是:

kill-INT-
您可以使用脚本非常轻松地对其进行测试:

#/usr/bin/env ruby
叉子{
陷阱(:INT){
将“信号接收到子对象中!”
出口
}
睡1000
}
将“run`kill-INT-#{Process.pid}`放在任何其他终端窗口中。”
等等
资料来源:


Per:如果未指定信号,则发送术语信号,因此
kill$PID
不会向进程发送
SIGINT
,因此与Ctrl+C键盘不同event@Alex抢手货虽然我不认为有实际的区别,但我可能错了。根据命令的不同,如果它安装了SIGTERM或SIGINT的处理程序,那么它可能会有所不同。总之,正如@paxdiablo所说,使用
kill-INT
kill-SIGINT
kill-2
@domen好的,我已经更新了答案,使其更精确。这取决于您是否希望将命令ctrl+c发送给其他进程作为输入。另请参阅如何获取像tomcat这样的特定进程的
pid
    pgrep -f process_name > any_file_name
    sed -i 's/^/kill /' any_file_name
    chmod 777 any_file_name
    ./any_file_name