绕过截断的“ps”

时间:2011-02-03 22:32:15

标签: solaris

我正在尝试编写一个基于关键字查找特定进程的脚本,提取PID,然后使用找到的PID将其终止。

我在Solaris中遇到的问题是,因为“ps”结果被截断,基于关键字的搜索将无法工作,因为关键字是截断的部分(过去80个字符)的一部分。

我读到你可以使用“/ usr / ucb / ps awwx”来获取超过80个字符的内容,但是从Solaris 10开始,这需要从root运行,我无法避免在我的脚本。

有没有人有任何关于获得PID的建议?前80个字符过于通用,无法搜索(java命令的一部分)。

感谢。

8 个答案:

答案 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)

我建议pgreppkill - http://www.opensolarisforum.org/man/man1/pkill.html - 而不是。

编辑0:

这个丑陋的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)

pargs在这里会有所帮助。虽然你必须遍历所有的运行过程,这有点烦人。但是当ps将截断它们时,这至少会显示所有的procs参数。

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