【发布时间】:2019-12-19 10:21:55
【问题描述】:
我正在尝试编写一个 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本身就是一个命令。对于您的情况,$!是sudo的 pid,而不是trace-cmd。 -
试试
sudo sh -c "trace-cmd record -p function -P $PID & echo \$! > ./pid_trace.txt" -
@MarkPlotnick 你的解决方案也很好用!