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

Dav*_* S. 311 shell bash process background-process

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

my-app &
echo $my-app-pid
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以只使用jobs -p my-app命令来grep pid。但是如果我想多次执行shell,这个方法就行不通了。因为工作规范是不明确的。

enz*_*tib 411

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

my-app &
echo $!
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,这代表*在后台*启动的程序。如果没有启动后台进程,则不设置该参数。 (42认同)
  • @user3153014 像 "[2] 2625" 这样的字符串在启动后台任务后被 shell 打印出来。这与 `echo $!` 的输出无关 (16认同)
  • (对答案的评论)[How to get pid of just started process](http://serverfault.com/a/205563/68972) 中提出了另一个有价值的解决方案:哦,还有“oneliner”:`/ bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &` – sysfault 10 年 11 月 24 日 14:28 (6认同)

Edu*_*omo 82

获取PID

#!/bin/bash
my-app &
echo $!
Run Code Online (Sandbox Code Playgroud)

保存PID在变量中:

#!/bin/bash
my-app &
export APP_PID=$!
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash
my-app &
echo $! >>/tmp/my-app.pid
Run Code Online (Sandbox Code Playgroud)

将输出、错误和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)"
Run Code Online (Sandbox Code Playgroud)

  • 该问题没有询问重定向,那么您的答案与接受的答案大致相同,只是如果“my-app”的一个实例完成,并且可能更糟糕的是它的 PID 稍后被重用,您将获得错误信息在您的文件中。我不认为这个答案真的为现有的接受答案增加了很多价值 (3认同)