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

my-app &
echo $my-app-pid


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

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

#1 楼

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

my-app &
echo $!


评论


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

–user3153014
2014年9月4日11:47



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

– ramrunner
2014年11月17日下午21:52

在如何获得刚刚启动的进程的pid中,提出了另一个有价值的解决方案(对答案的评论):哦,还有“单行”:/ bin / sh -c'echo $$> / tmp / my.pid && exec program args'&– sysfault 2010年11月24日,14:28

– imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev)
2015年6月2日14:11在

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

–彼得·格拉德基克(Petr Gladkikh)
15年7月26日在5:21



当我需要等到过程结束时,通常会在脚本中使用此类代码。 my-app和myVar = $! ; fg。 fg使该过程再次得到关注。然后,我可以稍后打印echo $ myVar,我很确定my-app已经完成。

– Vrata Blazek
19 Mar 4 '19 at 17:17



#2 楼

获取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)"


评论


该问题并未询问重定向问题,因此您的答案与接受的答案基本相同,不同之处在于,如果my-app实例完成,并且可能更糟的是其PID稍后被重用,则您的信息将不正确。文件。我认为这个答案真的不能为现有的答案增加很多价值

–埃里克·雷诺夫(Eric Renouf)
16年1月22日在15:12

@EricRenouf帖子已更新!

–爱德华多·库莫(Eduardo Cuomo)
16年1月22日在15:42

另一个可能有用的派生词。这将获得PID,同时将其视为(主要是)前台进程:sleep 4 | grep无效并导出MY_PID = $ !; fg;回声$ MY_PID与$返回? `

– mlathe
18年4月26日在21:53

是不是APP = main和获取PID的方法?

– MrMesees
18年8月30日在7:54

#3 楼

尝试类似

pidof my_app >> /tmp/my_app.pid


评论


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

– papo
19年1月2日在8:13

#4 楼

尝试这样的操作:

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


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

评论


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

–垫子
2012年1月30日12:10

如果您甚至走这条路线,也应该改用pgrep。

–威廉
2015年1月19日,12:41