Обойти усеченные "пс" - PullRequest
       6

Обойти усеченные "пс"

10 голосов
/ 04 февраля 2011

Я пытаюсь написать скрипт, который найдет конкретный процесс на основе ключевого слова, извлечет PID, а затем уничтожит его с помощью найденного PID.

Проблема, с которой я столкнулся в Solaris, заключается в том, что, поскольку результаты "ps" усечены, поиск по ключевому слову не будет работать, поскольку ключевое слово является частью усеченного раздела (более 80 символов).

Я прочитал, что вы можете использовать "/ usr / ucb / ps awwx "чтобы получить что-то более 80 символов, но начиная с Solaris 10, его нужно запускать из-под root, и я не могу избежать этого ограничения в моем скрипте.

Кто-нибудьесть предложения для получения этого PID?Первые 80 символов слишком общие для поиска (часть команды java).

Спасибо.

Ответы [ 7 ]

14 голосов
/ 09 сентября 2011

Это работает для меня, по крайней мере на Joyent SmartMachine:

/usr/ucb/ps auxwwww
9 голосов
/ 04 февраля 2011

Ваше предположение о поведении 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
3 голосов
/ 04 февраля 2011

Я бы предложил pgrep и pkill - 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

Я уверен, что для этого есть более короткое заклинание, но мой ракушка немного ржавый.
Отказ от ответственности: только протестировано в bash на Linux, вероятно, тоже подойдет.

2 голосов
/ 25 апреля 2011

парги помогут здесь. хотя вам придется перебирать все запущенные процессы, что немного раздражает. но это по крайней мере покажет вам все аргументы procs, когда ps обрезает их

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
1 голос
/ 25 ноября 2011
/usr/ucb/ps -auxww | grep <processname> or <PID>
1 голос
/ 04 февраля 2011

Я точно не помню, что такое солярис, и у меня нет доступа к нему сейчас, только завтра, но в любом случае лучше упорядочить нужные вам поля - это упрощает синтаксический анализ.

ps -o pid,args

Если вывод обрезан, может быть, установка имени столбца в длинную строку поможет.

0 голосов
/ 04 февраля 2011

Используйте параметр -w (дважды для неограниченной ширины):

$ ps -w -w -A -o pid,cmd 
...