Bash 脚本应该只杀死它已经启动的另一个脚本的那些实例

Xav*_*uvw 11 bash process

在当前情况下,某个脚本'calling.sh'在后台启动另一个脚本'calling.sh',执行其他操作,休眠一段时间,然后以pkill called.sh.终止'calling.sh' 。这工作正常。

然后,我还想在任何其他时间从其他终端启动“被调用的.sh”作为独立脚本,无论是在启动 call.sh 之前还是之后。这些独立的实例应该被 'calling.sh' 杀死。

我怎样才能做到这一点?直觉说,调用脚本应该能够告诉它从同时运行的任何其他同名进程开始的进程。

作为变体,'calling.sh' 也可以启动'被调用',它是到'被调用的.sh'的符号链接。这会使管理上述情况变得复杂吗?使用符号链接需要哪些特定的注意事项和调整?

ter*_*don 27

不要用名字来杀死它。由于calling.sh脚本正在调用您以后想要杀死的进程,因此只需使用$!(from man bash):

! 扩展到最近放入后台的作业的进程 ID,无论是作为异步命令执行还是使用bg内置命令

所以,如果你calling.sh是这样的:

called.sh &
## do stuff
pkill called.sh
Run Code Online (Sandbox Code Playgroud)

改成这样:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"
Run Code Online (Sandbox Code Playgroud)

  • 只要被调用的.sh 不会自行消亡,这应该可以工作,否则它的 pid 可能会被重用,从而杀死一个无辜且无关的进程。 (4认同)
  • @EugeneRyabtsev 这是一个很好的观点。我想你也可以检查一下`$CalledPid` 的父PID 是`Called.sh` 的PID。 (2认同)

Phi*_*ing 18

我不得不多次选择这个,但在脚本之外;当脚本作为复杂的自动化计划的一部分被调用时,它会更加有趣。您真的不应该依赖于pkill选择要杀死的脚本之类的东西。

在 call.sh 中,您应该记录已启动的作业的 PID,并通过 PID 明确地杀死它们。

在 call.sh 中:

./called.sh &
called_pid=$!

# Later
kill $called_pid
Run Code Online (Sandbox Code Playgroud)