【问题标题】:Bash: Cannot send ctrl+c into started programBash:无法将 ctrl+c 发送到已启动的程序中
【发布时间】: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 你的解决方案也很好用!

标签: bash signals


【解决方案1】:

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

尝试以下选项之一:

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

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

【讨论】:

  • 感谢您的解释!我将测试其中一种是否有效。
猜你喜欢
  • 2014-08-25
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多