如何获得刚起步的过程

我想开始进程(例如myCommand)并获得它的pid(以便稍后杀死它)。

我尝试了ps并按名称过滤,但我无法通过名称来区分过程

myCommand ps ux | awk '/<myCommand>/ {print $2}' 

因为进程名称不是唯一的。

我可以运行过程:

 myCommand & 

我发现我可以得到这个PID:

 echo $! 

有没有更简单的解决scheme?

我会很乐意执行myCommand,并通过一行命令获得PID。

什么可以比echo $!简单echo $! ? 作为一条线:

 myCommand & echo $! 

把这个命令包装在一个小脚本中

 #!/bin/bash yourcommand & echo $! >/path/to/pid.file 

我不知道任何更简单的解决scheme,但不使用$! 够好了? 正如其他人所说的那样,如果您以后需要这个值,您可以随时将这个值赋给其他variables。

作为一个方面说明,而不是从pspipe道可以使用pgreppidof

将pid注册到文件后,使用bash脚本中的exec:

例:

假设你有一个名为“forever.sh”的脚本,你想用参数p1,p2,p3运行

forever.sh源码:

 #!/bin/sh while [ 1 -lt 2 ] ; do logger "$0 running with parameters \"$@\"" sleep 5 done 

创build一个reaper.sh:

 #!/bin/sh echo $$ > /var/run/$1.pid exec "$@" 

通过reaper.sh运行forever.sh:

 ./reaper.sh ./forever.sh p1 p2 p3 p4 & 

forever.sh无非是每隔5秒logging一行到系统日志

你现在在/var/run/forever.sh.pid中有了pid

 cat /var/run/forever.sh.pid 5780 

forever.sh正在运行。 syslog grep:

 Nov 24 16:07:17 pinkpony cia: ./forever.sh running with parameters "p1 p2 p3 p4" 

你可以在stream程表中看到它:

 ps axuwww|grep 'forever.sh p1' |grep -v grep root 5780 0.0 0.0 4148 624 pts/7 S 16:07 0:00 /bin/sh ./forever.sh p1 p2 p3 p4 

你可以使用像这样的东西:

 $ myCommand ; pid=$! 

要么

 $ myCommand && pid=$! 

这两个命令可以是关节使用;&& 。 在第二种情况下,仅当第一个命令成功时才会设置pid。 你可以从$pid获得进程ID。

这是一个黑客答案,并不会为大多数人工作。 这也是一个巨大的安全风险,所以不要这样做,除非你确定你会安全的,并且input信息被消毒,那么你就明白了。

编译这个小C程序到一个名为start (或任何你想要的)的二进制文件,然后运行你的程序./start your-program-here arg0 arg1 arg2 ...

 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main(int argc, char **argv) { if (argc >= 2) { printf("%lu\n", (long unsigned) getpid()); if (execvp(argv[1], &argv[1]) < 0) { perror(NULL); return 127; } } return 0; } 

长话短说,这将打印PID到stdout ,然后加载你的程序进程。 它应该仍然有相同的PID。

在bash shell中替代$! 可能是内置的jobs -p 。 在某些情况下!$! 在variables扩展之前(或代替)由shell解释,导致意外的结果。

例如,这将不起作用:

 ((yourcommand) & echo $! >/var/run/pidfile) 

而这将会:

 ((yourcommand) & jobs -p >/var/run/pidfile)