【发布时间】:2021-08-08 14:43:22
【问题描述】:
我有一个这样的脚本:
sh child1.sh &
child=$!
sh child2.sh
kill "$child"
我为另一个进程运行一个后台进程child1:child2 使用,当child2 完成时,我杀死child1。
现在无论出于什么原因,我现在想在子进程中运行child1.sh,即像这样运行它:
(sh child1.sh)
如何将子进程的 id 传递给父进程,以便像以前一样杀死它?
我试过了:
(sh child1.sh &)
和
(sh child1.sh ) &
但似乎都不起作用。
【问题讨论】:
-
hmm 我使用
()的原因是:stackoverflow.com/questions/786376/… 我想避免不得不 cd 回到原始目录。也许我没有使用正确的术语? -
我会说这样做的方法是
(sh child1.sh ) &。之后发出child=$!时,您将不会获得child1.sh的PID,而是child1.sh正在运行的shell 的PID。在我看来,这不是问题,因为在正常情况下杀掉 shell 会杀掉所有的子进程,只要你没有用nohup启动这些子进程。 -
@PierreFrançois 要杀死的进程是一个节点应用程序,当我按照我的建议进行操作时。我得到这个记录:
终止。但是随后该进程仍在后台运行,并且我以后再次尝试运行父脚本的尝试失败了,因为端口仍然很忙。 -
@Mathsnoob:
child1.sh是或运行节点应用程序这一事实大大改变了问题。也许它在被杀死时不会优雅地退出。您应该提及 node app 作为关键字,并提供有关 node 应用程序在多种类型的信号被杀死时如何退出的更多信息。 -
@PierreFrançois 嗯。当我在没有子进程的情况下杀死它时,节点应用程序会优雅地死掉。所以我不认为这是
child1固有的任何东西,而是更多关于我们如何杀死它? :思考