如何获取Shell脚本中最后执行的命令的pid?


254

我想要一个这样的shell脚本:

my-app &
echo $my-app-pid

但是我不知道如何获取刚刚执行的命令的pid。

我知道我可以使用jobs -p my-app命令grep pid。但是,如果我想多次执行外壳程序,则此方法将不起作用。因为jobspec模棱两可。

Answers:


338

最后执行的命令的PID在$!shell变量中:

my-app &
echo $!

1
例如正在打印pid。[1] 893。我只想要数字。
user3153014 2014年

33
应当指出,这代表了在后台启动的程序。如果尚未启动任何后台进程,则不会设置该参数。
ramrunner

5
另一个有价值的解决方案在“ 如何获得刚刚启动的过程的pid”中提出了一个建议:哦,还有“ oneliner”:/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &– sysfault 2010年11月24日,14:28
imz – Ivan Zakharyaschev

14
@ user3153014启动后台任务后,shell会打印诸如“ [2] 2625”之类的字符串。这与echo $!
Petr Gladkikh的

当我需要等到过程结束时,通常会在脚本中使用此类代码。my-app & myVar=$! ; fgfg再次将过程推向前台。然后,我可以稍后打印,echo $myVar并且我很确定my-app已经完成。
Vrata Blazek

66

得到PID

#!/bin/bash
my-app &
echo $!

保存PID在变量中:

#!/bin/bash
my-app &
export APP_PID=$!

将所有实例保存PID在文本文件中:

#!/bin/bash
my-app &
echo $! >>/tmp/my-app.pid

将输出,错误和PID单独的文件保存:

#!/bin/bash
my-app >/tmp/my-app.log 2>/tmp/my-app.error.log &
echo $! >>/tmp/my-app.pid

echo "my-app PID's: $(cat /tmp/my-app.pid)"

3
该问题并未询问重定向问题,因此您的答案与公认的答案几乎相同,不同之处在于,如果my-app完成实例(甚至更糟的是其PID稍后被重用)会在文件中包含错误信息。我认为此答案并不能真正为现有的答案增加太多价值
Eric Renouf

@EricRenouf帖子已更新!
Eduardo Cuomo

另一个可能有用的派生词。这将获得PID并同时将其视为(主要是)前台进程:sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?`
mlathe

APP =不是main &获取PID的方法吗?
MrMesees

3

尝试类似

pidof my_app >> /tmp/my_app.pid

1
外部命令,而且很慢,如果系统可以直接提供PID,为什么要搜索所有进程来找到它呢?而且,不能肯定您会获得正确的价值
papo

-4

尝试这样的事情:

 ps ef | grep "[m]y-app" | awk '{print $2}'

将流程的第一个字母放在两个字母之间[ ]可确保您没有将grep流程添加到列表中。如果需要,您还可以在用户名上添加grep。


9
这充其量是非常脆弱的,并且如果my-app执行多次则不起作用-davidshen84特别担心该cas。
Mat

2
如果您甚至选择这条路线,也应该pgrep改用。
威廉2015年
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.