我正在尝试编写一个基于关键字查找特定进程的脚本,提取PID,然后使用找到的PID将其终止。
我在Solaris中遇到的问题是,因为“ps”结果被截断,基于关键字的搜索将无法工作,因为关键字是截断的部分(过去80个字符)的一部分。
我读到你可以使用“/ usr / ucb / ps awwx”来获取超过80个字符的内容,但是从Solaris 10开始,这需要从root运行,我无法避免在我的脚本。
有没有人有任何关于获得PID的建议?前80个字符过于通用,无法搜索(java命令的一部分)。
感谢。
答案 0 :(得分:14)
这对我有用,至少在Joyent SmartMachine上是这样的:
/usr/ucb/ps auxwwww
答案 1 :(得分:9)
您对ps行为的假设是不正确的。即使您没有以root身份登录,“/ usr / ucb / ps -ww”也不会截断您拥有的进程的参数,即对于您可以杀死的进程,这是您唯一感兴趣的进程。
$ cat /etc/release
Oracle Solaris 10 9/10 s10x_u9wos_14a X86
Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
Assembled 11 August 2010
$ id
uid=1000(jlliagre) gid=1000(jlliagre)
$ /usr/ucb/ps | grep abc
2035 pts/3 S 0:00 /bin/ksh ./abc aaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbb
$ /usr/ucb/ps -ww | grep abc
2035 pts/3 S 0:00 /bin/ksh ./abc aaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ccccccccccccccccccccccccccccccccccccccccccccccccccccccc ddddddddddddddddddddddddddddddddddddddddddd
答案 2 :(得分:3)
我建议pgrep
和pkill
- http://www.opensolarisforum.org/man/man1/pkill.html - 而不是。
这个丑陋的procfs
黑客怎么样:
~$ for f in /proc/[0-9]*/cmdline; do if grep -q --binary-files=text KEYWORD $f; \
> then l=`dirname $f`;p=`basename $l`; echo "killing $p"; kill $p; fi; done
我确信这有一个较短的咒语但我的炮弹有点生锈
免责声明:仅在Linux上的bash
中进行测试,也可能与之匹配。
答案 3 :(得分:2)
user@machine:(/home/user)> pargs 23097
23097: /usr/bin/bash ./test.sh aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbb
argv[0]: /usr/bin/bash
argv[1]: ./test.sh
argv[2]: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
argv[3]: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
argv[4]: ccccccccccccccccccccccccccccccccccccccccc
答案 4 :(得分:1)
我不记得究竟是关于solaris的,我现在无法访问它,只是明天,但无论如何最好订购你想要的字段 - 简化解析。
ps -o pid,args
如果输出被截断,可能将列名设置为long string应该有帮助。
答案 5 :(得分:1)
/usr/ucb/ps -auxww | grep <processname> or <PID>
答案 6 :(得分:0)
ps
为我工作;试图欺骗stdout
认为tty
不是$HOME/.bashrc
。
答案 7 :(得分:-2)
使用-w
选项(两次无限宽度):
$ ps -w -w -A -o pid,cmd