我想开始进程(例如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道可以使用pgrep
或pidof
。
将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)