我正在尝试在脚本(bash)中执行一些流程控制。因此,我将当前进程的进程组id输出到一个文件中。
ps ax -o '%p %r'|perl -ne 'if ($_ =~ /\s*$$\s*(\d+)/) { print "$1"; exit; }' > $pgidfile
nohup $JAVA_HOME/bin/java -cp somejar.jar some.java.Program & > /dev/null 2>&1
我也尝试过:
ps ax -o '%p %r'|awk '/'"$$"' [0-9]+/ {print $2}' > $pgidfile
nohup $JAVA_HOME/bin/java -cp somejar.jar some.java.Program & > /dev/null 2>&1
然而,在这两种情况下,文件(在$pgidfile中)似乎都是空的。(尽管在某些罕见的情况下,它似乎确实具有正确的值。)此外,只需在命令行上运行命令(输出进程组id -上面的选项1或选项2)就可以做正确的事情。
如果有人能为上述问题提出解决方案或回答以下两个问题中的一个(或两个),那就太好了:
1)在shell或perl脚本中获取进程的组id的建议方法是什么?
2)在nohup下运行命令是否会改变与使用nohup执行的命令无关的先前/后续命令的输出重定向?
发布于 2010-07-14 14:09:16
perl 1)在
或perl脚本中获取进程的组id的建议方法是什么?
对您当前方法的改进将是在您关心的PID上进行精确的字段匹配。任何未锚定的正则表达式技术(例如您的原始帖子)都有匹配错误内容的风险。如果$$恰好是123,您将匹配PID为1123、1234等的ps
输出行。
现在,awk
和perl
都非常擅长处理字段分隔的输入(请参阅perl's -a
switch),但您不需要这样做,因为您可以将ps
限制为您关心的流程:
$ ps -o '%r' $$ | tail -n 1 > $pgfile
了解如何告诉您的ps
省略报头,您可以从该管道中删除tail
。
2)在nohup下运行命令是否会改变与使用nohup执行的命令无关的先前/后续命令的输出重定向?
不是的。您的方案中还有一些地方不对劲。
发布于 2010-07-14 02:05:14
与其求助于笨拙的shell脚本和ps
,为什么不让您的Java程序拥有自己的pgid呢?在最坏的情况下,您可以在一行JNI方法中完成此操作。
发布于 2010-07-14 02:21:53
ps ax -o '%p %r' | awk -vp=$$ '$0~p{print $2}'
https://stackoverflow.com/questions/3242871
复制相似问题