Skrypt Bash, aby znaleźć i zabić proces z określonymi argumentami?

17

Chcę skryptu, który zabija instancję (y), sshktóre są uruchamiane z argumentem -D (konfigurowanie lokalnego proxy).

Ręcznie, szukam ps -A | grep -i sshinstancji z -D i kill -9 {id}każdą z nich.

Ale jak to wygląda w formie skryptu bash?

(Jestem na Mac OS X, ale zainstaluję niezbędne polecenia za pośrednictwem port)

Ricket
źródło
Zobacz alternatywy pgrep i pkill na Mac OS X? . pgrepi pkillsą poleceniami do niezawodnego znajdowania lub zabijania procesów według nazw w systemach Solaris i Linux.
Gilles „SO- przestań być zły”

Odpowiedzi:

26

Uruchom pgrep -f "ssh.*-D"i sprawdź, czy to zwróci prawidłowy identyfikator procesu. Jeżeli tak, wystarczy zmienić pgrepsię pkilli zachować te same opcje i wzór

Ponadto, nie powinieneś używać kill -9aka SIGKILL, chyba że jest to absolutnie konieczne, ponieważ programy nie mogą uwięzić SIGKILL, aby posprzątać po sobie przed wyjściem. Używam dopiero kill -9po pierwszej próbie -1 -2i -3.

SiegeX
źródło
powinieneś przedefiniować zabójstwo jako forpętlę, która działa kill -idla każdego i;)
Seamus
1
pgrepnie jest macierzysty w OSX, musisz go uzyskać od strony trzeciej. Poprzedni wątek na ten temat zawiera propozycje i alternatywy.
Gilles „SO- przestań być zły”
człowieku żyje, im więcej używam 'nix, tym bardziej to uwielbiam :) dzięki za to!
javamonkey79
pgrep i pkill są dostępne w OS X 10.8 (Mountain Lion) i nowszych. apple.blogoverflow.com/2012/07/…
Peter Hanley
Przydatne może być dodanie -aflagi, pgrepktóra powoduje, że wypisuje ona nie tylko identyfikator procesu, ale także polecenie (w tym argumenty). W ten sposób bardzo łatwo jest zweryfikować, że pasują tylko pożądane procesy.
luator
1

Również,

kill `pgrep -f "ssh.*-D"`
Barun
źródło
3
Myślę, że jest to równoważne zpkill
Michael Mrozek
0

Możesz wykorzystać system plików proc do zebrania informacji. Na przykład:

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

To nie jest idealne, będziesz potrzebować bardziej ekskluzywnego wyrażenia regularnego (szczególnie jeśli zabijasz procesy), ale echo $proc | awk -F'/' '{ print $3 }'pokaże ci PID procesu (ów).

Tok
źródło
1
OSX nie ma /proc. Istnieje już niezawodne narzędzie do tego, o nazwie pgrep(dostępne natywnie przynajmniej w systemach Solaris i Linux).
Gilles „SO- przestań być zły”