簡體   English   中英

如何在freeBSD的命令行中獲取java進程的進程id,sh

[英]how to get the process id for a java process at the command line in freeBSD, sh

我需要一些幫助來編寫一個將被放入.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

任何幫助表示贊賞。 謝謝。

如果通過shell腳本自動啟動,則可以編寫變量$!剛剛啟動的進程的pid $!

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

當你需要殺死它時,只需:

kill `cat myjavaprogram.pid`

下面的pgrep命令用於通過jar文件名獲取pid:

pgrep -f test-app.jar

根據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它可能會幫到你?

一種方法可以在: man pgrep

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM