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

Bash: Cannot send ctrl+c into started program

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

我已经找到了获取 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 信号不是 "delivered" 或者 SIGINT 不是 trace-cmd 期望的信号(程序可以拦截这些信号吗?或者击键)

如有任何帮助,我们将不胜感激!

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

尝试以下选项之一:

  1. 考虑在 sudo 上使用常规 kill(否 -INT)。这将使用 TERM 信号,这将导致 sudo 终止子进程。

  2. INT信号直接发送到frace(pkill -INT trace_cmd)