我需要一些帮助来编写一个将被放入.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
感谢任何帮助。感谢。
答案 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
- 醇>
如何根据流程名称获取流程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它可能对你有帮助吗?
答案 3 :(得分:0)
可以在man pgrep