【问题标题】:Open and then kill child process from bash从 bash 打开然后杀死子进程
【发布时间】:2011-09-15 23:59:20
【问题描述】:

执行命令然后在一段时间后将其终止的最佳方法是什么?这就是我所拥有的;它完成了这项工作,但我得到了amp: command not found,虽然我不确定为什么放大器首先存在,但我知道没有它,杀戮是行不通的。

feh "$output""$ext" &
echo $!
sleep 1
kill -s 9 $!
exit 1

问题是我不知道我正在执行的进程的 PID。我可以在执行时分配一个吗?

【问题讨论】:

  • 您可能需要查看一些被转换为显示为 HTML 的代码; & 在 HTML 中将显示为 &
  • 为什么要将$! 放入变量中?这有什么好处吗?
  • 如果你把$!放到一个变量中,你在后台运行其他东西不会丢失值。
  • 除非你知道后果,否则你应该避免kill -9。见partmaps.org/era/unix/award.html#kill

标签: bash parent-child kill


【解决方案1】:

GNU timeout,最新版本的 coreutils 的一部分,完全符合您的要求。

timeout 1 feh "$output""$ext"

运行feh 一秒钟,然后杀死它,如果它还没有结束的话。

此评论的其余部分涉及您当前的食谱:

您当前使用的配方使用&feh 置于后台。后面的amp; 是一个错误,可能来自一些过分热心的 HTML 编码器(& 是你在 HTML 中拼写 & 的方式)。

每个进程在启动时都会被内核分配一个 PID。 $! 是最近后台进程的 pid 的 shell 变量。

【讨论】:

  • 最近是什么意思?
  • timeout 的第一个稳定版本据我所知是在 2009 年发布的 coreutils 7.1 中。
  • 优雅直观!非常好的答案。为我 +1。
【解决方案2】:

你不想要“&”你只想要“&”。 & 号告诉 bash 在后台运行进程。

$!设置为后台进程的 pid,否则您的示例应该执行您想要的操作。

【讨论】:

    【解决方案3】:
    feh "$output""$ext" &
    FEHPID=$!
    sleep 1
    kill -s 9 $FEHPID
    exit 1
    

    【讨论】:

    • 这是最通用的解决方案,因为您可以在主脚本上做其他事情,而在 daxelrod 的解决方案中是做不到的。我只是希望它没有说kill -9 :-)
    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2019-06-23
    • 2011-06-11
    相关资源
    最近更新 更多