我正在尝试在脚本中执行一些过程控制(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执行的命令无关的上一个/后续命令的输出重定向?
答案 0 :(得分:1)
1)在shell或perl脚本中获取进程的组ID的建议方法是什么?
对当前方法的改进是对您关心的PID进行精确字段匹配。任何未锚定的正则表达式技术(例如您的原始帖子)都存在匹配错误内容的风险。如果$$恰好是123,那么你将匹配PID 1123,1234等的ps
输出行。
现在,awk
和perl
都非常善于处理字段分隔输入(请参阅perl's -a
switch),但您不需要这样做,因为您可以限制{{ 1}}只关注你关心的过程:
ps
了解如何告知$ ps -o '%r' $$ | tail -n 1 > $pgfile
省略标题,并从该管道中删除ps
。
2)在nohup下运行命令是否会改变与nohup执行的命令无关的上一个/后续命令的输出重定向?
没有。在您的场景中还有其他问题。
答案 1 :(得分:0)
为什么不让你的Java程序得到自己的pgid,而不是诉诸于笨拙的shell脚本和ps
?在最坏的情况下,您可以使用单行JNI方法执行此操作。
答案 2 :(得分:0)
ps ax -o '%p %r' | awk -vp=$$ '$0~p{print $2}'
答案 3 :(得分:0)
在Perl中,您可以使用$(
获取流程的真实群组ID,并使用$(
获取其有效群组ID。请参阅perldoc perlvar。