【问题标题】:how to get the process id for a java process at the command line in freeBSD, sh如何在freeBSD的命令行中获取java进程的进程ID,sh
【发布时间】:2011-05-14 18:47:59
【问题描述】:

我需要一些帮助来编写将放入 .sh 的命令。我想返回进程 id,在下面的输出中是 3678,但是我遇到了困难,因为进程 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

感谢任何帮助。谢谢。

【问题讨论】:

  • 您希望 Java 程序在执行结束时返回其 pid?还是Java程序退出后返回Java程序pid的shell脚本?
  • 外壳程序。 java程序会一直运行,这只是一个获取pid的shell脚本

标签: java linux bash unix shell


【解决方案1】:

如果启动是由 shell 脚本自动启动的,您可以将刚刚启动的进程的 pid 写入变量 $!

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

当你需要杀死它时,就这样做:

kill `cat myjavaprogram.pid`

【讨论】:

    【解决方案2】:

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

    pgrep -f test-app.jar

    【讨论】:

      【解决方案3】:

      根据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 程序。即便如此, 上述竞争条件仍然存在。

      话虽如此,看看这个:http://www.faqs.org/faqs/unix-faq/faq/part3/section-10.html 它可能会帮助你吗?

      【讨论】:

      • 谢谢,那个链接给了我我需要的东西。感谢您的解释,它帮助我更好地理解了这一点。我是服务器上唯一的一个,只有 2 个 Java 程序在运行……我会看看这是怎么回事。
      【解决方案4】:

      一种方法可以在:man pgrep

      【讨论】:

      猜你喜欢
      • 2012-02-25
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多