Bash:无法将ctrl+c发送到已启动的程序中

Bash:无法将ctrl+c发送到已启动的程序中,bash,signals,Bash,Signals,我正在尝试编写一个bash脚本,它启动一个程序,等待x秒,然后向程序发送ctrl+c信号以停止它。 该程序是trace cmd,它是ftrace的前端,在按下ctrl+c之前记录/跟踪数据 我已经找到了一个解决方案来获取trace cmd的PID,并使用kill向其发送SIGINT信号。然而,不知何故,它不起作用 这是我在一行中执行的命令,只是为了可读性而格式化: sudo trace-cmd record -p function -P $PID & echo $! > ./pid

我正在尝试编写一个bash脚本,它启动一个程序,等待x秒,然后向程序发送ctrl+c信号以停止它。 该程序是trace cmd,它是ftrace的前端,在按下ctrl+c之前记录/跟踪数据

我已经找到了一个解决方案来获取trace cmd的PID,并使用kill向其发送SIGINT信号。然而,不知何故,它不起作用

这是我在一行中执行的命令,只是为了可读性而格式化:

sudo trace-cmd record -p function -P $PID & echo $! > ./pid_trace.txt & 
    echo "[+] Stored PID:" $(cat ./pid_trace.txt) & 
    sleep $seconds; printf "Killing trace-cmd\n"; sudo kill -INT $(cat ./pid_trace.txt)
“echo”只是为了测试,我使用了txt文件,因为我无法分配$!变量的值。据我所知:&的使用使得这些命令可以并发执行,而;这样他们就可以一个接一个地执行。所以:我应该启动trace cmd,存储PID而不是启动时间,并且只有在计时器完成后才执行kill

当在执行trace cmd时按下ctrl+c信号时,基本上可以看到一个特定的输出,即存储了跟踪。然而,用我的bash程序我看不到它。我假设kill信号没有被传递,或者SIGINT不是trace cmd期望的信号,那么程序能截获这些信号吗?或者是按键,而不是


任何帮助都将不胜感激

sudo进程不会将INT信号传递给它的子进程。CTRL/C处理将INT信号传递给所连接终端在前台运行的所有进程

请尝试以下选项之一:

考虑在sudo NO-INT上使用常规kill。这将使用术语信号,这将导致sudo终止子进程

将INT信号直接发送至frace pkill-INT trace_cmd


sudo本身就是一个命令。就你的情况而言,$!是sudo的pid,而不是trace-cmd。请尝试sudo sh-c trace cmd record-p function-p$pid&echo\$!>/pid_跟踪。txt@MarkPlotnick你的解决方案也很有效!谢谢你的解释!我要测试其中一个是否有效。