首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确获取一组后台命令的PID并将其删除?

如何正确获取一组后台命令的PID并将其删除?
EN

Stack Overflow用户
提问于 2013-06-06 21:15:33
回答 3查看 532关注 0票数 1

好的,就像在这个线程中,How to get PID of background process?,我知道如何获取后台进程的PID。然而,我需要做的不只是一个操作。

代码语言:javascript
运行
复制
{
           sleep 300;

           echo "Still running after 5 min, killing process manualy.";
           COMMAND COMMAND COMMAND

           echo "Shutdown complete"
}&
PID_CHECK_STOP=$!
some stuff...
kill -9 $PID_CHECK_STOP

但它不起作用。看起来我要么PID不好要么就是杀不掉它。我尝试运行ps | grep睡眠,它给出的pid总是紧挨着我在PID_CHECK_STOP中得到的pid。有没有办法让它工作呢?我能不能用另一种方式包装这些命令,这样我就可以在需要的时候把它们全部杀死?

伙计们!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-06 21:31:40

kill -9在它可以做任何其他事情之前杀死该进程,包括向其子进程发出退出的信号。使用更温和的信号(kill本身发送一个术语就足够了)。不过,您确实需要让进程通过trap命令向其子进程发出信号,使其显式退出(如果有的话)。

我假设sleep是实际命令的占位符。然而,sleep是棘手的,因为它忽略任何信号,直到它返回(即,它是不可中断的)。要使您的示例工作,请将sleep本身放在后台,并立即在其上使用wait。当您终止“外部”后台进程时,它将中断wait调用,这将允许sleep也被终止。

代码语言:javascript
运行
复制
{
       trap 'kill $(jobs -p)' EXIT
       sleep 300 & wait

       echo "Still running after 5 min, killing process manualy.";
       COMMAND COMMAND COMMAND

       echo "Shutdown complete"
}&
PID_CHECK_STOP=$!
some stuff...
kill $PID_CHECK_STOP

更新:COMMAND COMMAND COMMAND包含一个通过sudo运行的命令。要杀死该进程,还必须通过sudo运行kill。请记住,这样做将运行外部kill程序,而不是内置的shell (两者之间没有什么区别;内置的内核允许您在达到进程配额时终止进程)。

票数 2
EN

Stack Overflow用户

发布于 2013-06-06 21:20:04

您可以使用包含这些命令的另一个脚本并终止该脚本。如果你正在为代码块动态生成代码,只需写出一个脚本,执行它,并在完成后杀死它。

票数 1
EN

Stack Overflow用户

发布于 2013-06-06 21:21:04

语句周围的{ ... }将启动一个新的shell,然后您将获得它的PID。块中的sleep和其他命令获得单独的PID。

为了说明这一点,请在ps afux | less中查找您的进程-父shell进程(在sleep之上)具有您刚刚获得的PID。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16963133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档