在正在运行的进程的变量中捕获Linux进程ID

在正在运行的进程的变量中捕获Linux进程ID,linux,bash,Linux,Bash,当我在Linux脚本中运行启动进程的命令时,我希望在变量中捕获该命令的进程号,以供以后使用(即稍后杀死它) 下面是启动进程的命令 ./run external 会不会是这样的: ./run external/ pid=$!? 手动执行:ps-ef | grep run,它给我一个进程ID,然后我可以手动终止它,但我想在变量中捕获脚本中的PID,因此我可以说:kill$variable(其中包含PID值) 想法?您可以扩展手动方法,使其自动工作: pid=$(ps -ef | grep run

当我在Linux脚本中运行启动进程的命令时,我希望在变量中捕获该命令的进程号,以供以后使用(即稍后杀死它)

下面是启动进程的命令

./run external
会不会是这样的:

./run external/ pid=$!?
手动执行:
ps-ef | grep run
,它给我一个进程ID,然后我可以手动终止它,但我想在变量中捕获脚本中的PID,因此我可以说:
kill$variable
(其中包含PID值)


想法?

您可以扩展手动方法,使其自动工作:

pid=$(ps -ef | grep run | grep -v grep | awk '{print $2}')

在后台运行的任务的PID在
$中

$ sleep 30 &
[1] 21493
$ echo $!
21493
$ ps -ef | grep sleep
dbj      21493 21414  0 11:42 pts/26   00:00:00 sleep 30

因此,您应该能够捕获该值,并在以后杀死该PID。

Ugh
pid=$(ps-ef | awk'/[r]un/{print$2}'
ps方法的问题是,如果多个进程正在运行,您可能会杀死错误的进程。由于也找到了awk进程,因此我使用了一个锚,仅在“someapplication”`pid=$(ps-ef | awk'/someapplication$/{print$2})上命中了1次`非常感谢@tripleee在这里提供的提示。OP不会通过shell启动后台进程。而是通过命令backgrounds本身。在这种情况下,shell无法通过
$!
输出后台进程id,因为它没有这些信息。大多数后台进程本身都有不这样做的选项,这这样以后杀他们就简单多了。