首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UNIX中的进程组Id

UNIX中的进程组Id
EN

Stack Overflow用户
提问于 2010-07-14 10:01:14
回答 4查看 2.6K关注 0票数 1

我正在尝试在脚本(bash)中执行一些流程控制。因此,我将当前进程的进程组id输出到一个文件中。

代码语言:javascript
运行
复制
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

我也尝试过:

代码语言:javascript
运行
复制
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执行的命令无关的先前/后续命令的输出重定向?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-14 22:09:16

perl 1)在

或perl脚本中获取进程的组id的建议方法是什么?

对您当前方法的改进将是在您关心的PID上进行精确的字段匹配。任何未锚定的正则表达式技术(例如您的原始帖子)都有匹配错误内容的风险。如果$$恰好是123,您将匹配PID为1123、1234等的ps输出行。

现在,awkperl都非常擅长处理字段分隔的输入(请参阅perl's -a switch),但您不需要这样做,因为您可以将ps限制为您关心的流程:

代码语言:javascript
运行
复制
$ ps -o '%r' $$ | tail -n 1 > $pgfile

了解如何告诉您的ps省略报头,您可以从该管道中删除tail

2)在nohup下运行命令是否会改变与使用nohup执行的命令无关的先前/后续命令的输出重定向?

不是的。您的方案中还有一些地方不对劲。

票数 1
EN

Stack Overflow用户

发布于 2010-07-14 10:05:14

与其求助于笨拙的shell脚本和ps,为什么不让您的Java程序拥有自己的pgid呢?在最坏的情况下,您可以在一行JNI方法中完成此操作。

票数 0
EN

Stack Overflow用户

发布于 2010-07-14 10:21:53

代码语言:javascript
运行
复制
ps ax -o '%p %r' | awk -vp=$$ '$0~p{print $2}'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3242871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档