Bash скрипт для поиска и уничтожения процесса с определенными аргументами?

17

Мне нужен скрипт, который убивает экземпляры, sshкоторые запускаются с аргументом -D (настройка локального прокси).

Вручную, я ps -A | grep -i sshсмотрю на экземпляр (ы) с -D, и kill -9 {id}каждый.

Но как это выглядит в форме bash-скрипта?

(Я нахожусь на Mac OS X, но установлю все необходимые команды через port)

Ricket
источник
Смотрите альтернативы pgrep и pkill на Mac OS X? , pgrepи pkillэто команды для надежного поиска или уничтожения процессов по именам в Solaris и Linux.
Жиль "ТАК - перестань быть злым"

Ответы:

26

Запустите pgrep -f "ssh.*-D"и посмотрите, вернет ли это правильный идентификатор процесса. Если это произойдет, просто изменить , pgrepчтобы pkillи сохранить те же параметры и шаблон

Кроме того, вы не должны использовать kill -9aka SIGKILL, если в этом нет крайней необходимости, потому что программы не могут перехватить SIGKILL, чтобы очистить себя перед выходом. Я использую только kill -9после первой попытки -1 -2и -3.

SiegeX
источник
Вы должны переопределить kill как forцикл, который подходит kill -iдля каждого i;)
Симус
1
pgrepне является родным для OSX, вы должны получить его от третьей стороны. В предыдущей ветке по теме есть предложения и альтернативы.
Жиль "ТАК - перестань быть злым"
Человек жив, чем больше я пользуюсь 'nix, тем больше я люблю его :) спасибо за это!
javamonkey79
pgrep и pkill доступны в OS X 10.8 (Mountain Lion) и выше. apple.blogoverflow.com/2012/07/…
Питер Хэнли
Может быть полезно добавить -aфлаг, с помощью pgrepкоторого он печатает не только идентификатор процесса, но и команду (включая аргументы). Таким образом, очень легко проверить, что сопоставляются только нужные процессы.
Луатор
1

Также,

kill `pgrep -f "ssh.*-D"`
Барун
источник
3
Я думаю, что это эквивалентноpkill
Майкл Мрозек
0

Вы можете использовать файловую систему proc для сбора информации. Например:

for proc in $(grep -irl "ssh.*-D" /proc/*/cmdline | grep -v "self"); do if [ -f $proc ]; then cat $proc && echo ""; fi; done

Это не идеально, вам понадобится более эксклюзивное регулярное выражение (особенно, если вы убиваете процессы), но echo $proc | awk -F'/' '{ print $3 }'покажет вам PID процесса (ов).

Tok
источник
1
OSX не имеет /proc . И уже есть надежный инструмент для этого, называемый pgrep(доступен изначально по крайней мере в Solaris и Linux).
Жиль "ТАК - перестань быть злым"