在当前情况下,某个脚本“calling.sh”在后台启动另一个脚本“calling.sh”,执行其他操作,休眠一段时间,然后以pkill called.sh
.这很好用。
然后,我还想从其他终端启动“called.sh”作为独立脚本在任何其他时间,无论是在启动 Calling.sh 之前还是之后。这些独立的实例不应该被“calling.sh”杀死。
我怎样才能实现这个目标?直觉告诉我们,调用脚本应该能够区分它启动的进程和同时运行的任何其他同名进程。
作为一个变体,“calling.sh”也可能启动“叫”,这是一个符号链接到“叫.sh”。这会使管理上述情况变得复杂吗?使用符号链接需要哪些具体注意事项和调整?
答案1
不要用这个名字来杀死它。由于calling.sh
脚本正在调用您稍后想要终止的进程,因此只需使用$!
(from man bash
):
!
扩展为最近放入后台的作业的进程 ID,无论是作为异步命令执行还是使用bg
内置
所以,如果你是calling.sh
这样的:
called.sh &
## do stuff
pkill called.sh
改成这样:
called.sh &
calledPid=$!
# do stuff
kill "$calledPid"
答案2
我不得不多次从剧本中选择这个;当脚本作为复杂的自动化计划的一部分被调用时,这就更有趣了。您确实不应该依赖诸如pkill
选择要终止哪个脚本之类的东西。
在calling.sh 内部,您应该记录已启动的作业的PID,并通过PID 显式终止它们。
在calling.sh里面:
./called.sh &
called_pid=$!
# Later
kill $called_pid