如何在freeBSD的命令行中获取java进程的进程id,sh

时间:2010-11-23 22:31:51

标签: java linux bash unix shell

我需要一些帮助来编写一个将被放入.sh的命令。我想返回进程id,它在下面的输出中是3678,但我有diffuclty因为每次重新启动时进程id都会改变,所以我的代码中断了

输出:

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

继续我正在做的事情,直到我意识到当pid改变后列改变了:

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

感谢任何帮助。感谢。

4 个答案:

答案 0 :(得分:13)

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

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

当你需要杀死它时,只需:

kill `cat myjavaprogram.pid`

答案 1 :(得分:2)

以下pgrep命令用于通过jar文件名获取pid:

pgrep -f test-app.jar

答案 2 :(得分:1)

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

  
      
  1. 如何根据流程名称获取流程ID?或者,我如何找到   如果进程仍在运行,给定进程ID?

         

    在shell中没有可靠的方法来移植它。一些   系统重用过程id很像文件描述符。那是,   他们使用目前尚未使用的最低编号的pid   开始新流程时这意味着你的pid   寻找是在那里,但可能不会指你想到的过程   确实如此。

         

    通常的方法是解析ps的输出,但这涉及到   一个竞争条件,因为你找到那种方式的pid可能不会参考   当你真正做一些事情时,同样的过程   PID。但是,在shell脚本中没有好办法   请注意,你可能正陷入陷阱。

         

    一个建议是在Solaris上使用pgrep,并使用'ps h -o pid -C   $ STRING'如果没有,你的ps支持该语法,但两者都不支持   那些是完美的或无处不在的。

         

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

         

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

  2.   

据说这看:http://www.faqs.org/faqs/unix-faq/faq/part3/section-10.html它可能对你有帮助吗?

答案 3 :(得分:0)

可以在man pgrep

中找到一种方法