bash子进程的PID(imapsync)-如何获得它?


15

谁能告诉我如何获取以bash执行的命令的PID。

例如,我有一个运行imapsync的bash脚本。

当脚本被杀死时,imapsync进程不会总是被杀死,因此我希望能够从脚本中以编程方式识别imapsync的PID,以便我可以在信号处理程序中自行杀死imapsync进程。

那么,如何从父bash脚本中以编程方式获取子进程的PID?


1
“ pidof imapsync”如何?它出什么问题了?
pitr 2011年

2
我不知道pidof。但是,既然我这样做了,就我所知,它对这种情况没有用,因为pidof似乎会返回系统上给定命令的所有过程,甚至是其他脚本/用户所拥有的过程。另外,imapsync实际上是一个perl脚本,因此我将使用pidof perl,这又可能返回不是imapsync并可能属于其他用户的进程。
詹森·谭

哈维尔是正确的。该页面将提供有关ProcessManagement的更多信息。
2011年

Answers:


4

imapsync有一个选项可以设置其pid的写入位置:

--pidfile:写入imapsync pid的文件。


FYI这并没有真正回答我在一般意义上的问题,但我没有发现--pidfile ARG,并与周围的一些faffing已经足够好为止..
杰森谭

@JasonTan为什么要教一个男人钓鱼,什么时候可以给他一个可口的预煮鱼片,让他回来然后再na你,明天吧?对旧帖子表示歉意,但为什么对Javiers的答案满意?
不同步的

46
any_command args &
my_child_PID=$!

IOW与$$保存您的PID一样,$!具有最近执行的后台命令的PID 。


谢谢,但是imapsync没有背景和$!如果在imapsync调用后的下一行或信号处理程序的第一行中回显它,则未设置。:-(
Jason Tan

6
如果它派生了孩子的背景,则父母有责任将孩子的PID保存在某个地方。通常的做法是一样的地方保存它/var/run/whatever.pid。也许有一个命令行选项要求它将PID保存在某个地方。如果不是,那听起来像是向作者询问或实现自己的功能。
哈维尔

1
强调背景知识。如果尚未将任何进程置于后台(即,带有&),则该$!变量未定义。
特雷弗2014年

1
如何回答刚刚开始的过程的pid)中提出了更多类似的解决方案。作为此答案的补充,有一条评论说:哦,“独行侠”:/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &– sysfault 2010年11月24日,14:28
imz – Ivan Zakharyaschev,2015年

10

不同于pidofpgrep可以给它提供各种选项来限制它返回PID的进程。一个可能特别有用的方法是使用当前进程的PID根据PPID进行选择。

pgrep -P $$ imapsync

如果它们是脚本的子代,则只会输出imapsync的PID。


0

如何暂时将imapsync置于后台,获取PID,然后使其前台...像这样:

imapsync &
pid=$!
wait $pid
retVal=$?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.