【问题标题】:Terminate child process as soon as the parent fish shell process terminates?父鱼壳进程终止后立即终止子进程?
【发布时间】:2019-02-22 14:11:45
【问题描述】:

我正在生成一个fish shell 作为后台作业,并从中生成inotifywait(一个监视指定文件并仅在更改后才返回的进程)。

然而,稍后,在一个未指定的时间点(此时不能保证inotifywait 已返回),我将杀死产生inotifywaitfish shell。

我的目标是让inotifywait 在产生它的 PPID 终止时自动终止。有没有办法做到这一点?

fish -c "inotifywait -qq $somefile && ..." &
# time passes, inotifywait hasn't returned
kill -15 (jobs -lp)
# the fish process is now terminated, but inoyifywait remains

我现在使用的临时破解方法是简单地更新正在监视的文件的访问时间(使用诸如 touch 之类的实用程序),以便最终返回 inotifywait

我在 linux 4.20.11 上使用 fish 3.0.1

【问题讨论】:

  • 为什么是fish?看起来你想做类似bash -c 'trap "kill $!" 0; inotifywait .... && ... & wait;' & 这样的事情,这样调用 inotifywait 的 shell 会在它终止时向它发送一个信号,但我不确定这是否适用于 fish。

标签: shell process fish


【解决方案1】:

不要在任何需要正常作业控制语义的情况下使用 fish。 Fish 是我用过的最好的交互式 shell。多年来,它一直是我的主要登录 shell。但它的工作控制一直被打破,回到第一个版本。为了好玩,请这样做:

fish -c 'trap "echo WTF; exit 3" TERM; sleep 666' &
kill (jobs -lp)

您不会看到“WTF”消息,后台鱼壳也不会终止。现在ps waux | grep sleep 并终止睡眠进程。您应该会在终端上看到“WTF”消息,并且您的交互式 shell 将报告后台鱼已终止。

对于这种情况,最简单的解决方案是只使用 bash/ksh/sh 作为后台脚本。

【讨论】:

  • 谢谢,我已经切换到bash 来完成这项特殊的工作。
猜你喜欢
  • 2012-01-18
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多