2010-11-23 99 views
3

我需要一些帮助来编写将放入.sh的命令。我想返回的进程ID,这在下面的输出是3678,但我有diffuclty因为进程ID的变化,每次它被重新启动,所以我的代码打破如何在FreeBSD的命令行中获取java进程的进程ID,sh

输出:

[[email protected] /usr/home/aaron]# ps -xauww | grep java | grep www 
www  3678 0.0 3.2 1308176 267864 ?? Is 3:21PM 0:17.19 [java] 
[[email protected] /usr/home/aaron]# 

继承人我在做什么,直到我意识到列改变时,PID改变:

ps -xauww | grep java | grep www | cut -d" " -f6 

任何帮助表示赞赏。谢谢。

+0

你想要的Java程序在执行结束时返回它的PID?或者在Java程序退出后返回Java程序的pid的shell脚本? – vpit3833 2010-11-23 22:38:02

+0

shell程序。 java程序会一直运行,这只是一个shell脚本来获取pid – Ronedog 2010-11-23 22:43:13

回答

1

一种方法可以发现:man pgrep

+0

你能告诉我代码吗? – Ronedog 2010-11-23 22:46:16

1

http://cfajohnson.com/shell/cus-faq-2.html

  1. 我如何给一个进程名称的进程ID?或者,如果进程仍在运行,给定进程ID,如何找到 ?

    在shell中没有可靠的方式可移植到此目录中。一些 系统很像文件描述符一样重用进程ID。也就是, 他们使用当前未使用的编号最小的pid 开始一个新的进程时。这意味着您正在寻找的pid是,但可能并不是指您认为它的作用 。

    通常的做法是解析PS的输出,但涉及 竞争条件,由于PID你会发现这样当你真正做到与 PID的东西可能不是指 相同的过程。虽然在shell脚本中没有很好的解决方法,所以 被告知你可能正在陷入陷阱。

    的一个建议是,如果在Solaris上使用p纤ep,如果没有“PS^h -o PID -C $ STRING”,和你的ps支持语法,但既不 那些都是完美或无处不在。

    编写C程序时的正常解决方法是创建一个pid 文件,然后用fcntl(2)将其锁定。然后,如果另一个程序 想知道该程序是否真的在运行,它可以尝试 锁定该文件。如果锁定尝试失败,那么它知道文件仍在运行 。

    除非我们可以提供 C程序,它可以尝试锁定脚本,否则我们在shell中没有这样的选项。即便如此,上述的竞态条件仍然存在。

话虽这么说,看看这个:http://www.faqs.org/faqs/unix-faq/faq/part3/section-10.html它可以帮助你吗?

12

如果启动由shell脚本自动完成,您可以编写变量$!中刚启动的进程的pid。

java ...... & 
echo "$!" > myjavaprogram.pid 

当你需要杀死它,只是做:

kill `cat myjavaprogram.pid` 
2

下面pgrep由JAR文件名得到PID指令的作品:

pgrep -f test-app.jar