Script Bash para encontrar e matar um processo com certos argumentos?

17

Eu quero um script que mata as instâncias sshque são executadas com o argumento -D (configurando um proxy local).

Manualmente, ps -A | grep -i sshprocure as instâncias com -D e kill -9 {id}cada uma.

Mas como é isso na forma de script bash?

(Estou no Mac OS X, mas instalarei todos os comandos necessários via port)

Ricket
fonte
Veja as alternativas pgrep e pkill no mac os x? . pgrepe pkillsão comandos para localizar ou eliminar de forma confiável processos por nome no Solaris e Linux.
Gilles 'SO- stop be evil' (

Respostas:

26

Execute pgrep -f "ssh.*-D"e veja se isso retorna o ID do processo correto. Se isso acontecer, simplesmente mude pgreppara pkille mantenha as mesmas opções e padrões

Além disso, você não deve usar o kill -9SIGKILL, a menos que seja absolutamente necessário, porque os programas não podem prender o SIGKILL a limpar depois de sair antes de sair. Eu só uso kill -9depois de tentar -1 -2e -3.

SiegeX
fonte
você deve redefinir a matança como um forloop que faz kill -ipara cada i;)
Seamus
1
pgrepnão é nativo no OSX, você deve obtê-lo de terceiros. O tópico anterior sobre o tópico tem propostas e alternativas.
Gilles 'SO- stop be evil' (
homem vivo, quanto mais eu uso o nix, mais eu amo :) obrigado por isso!
Javaonkey79
O pgrep e o pkill estão disponíveis no OS X 10.8 (Mountain Lion) e acima. apple.blogoverflow.com/2012/07/...
Peter Hanley
Pode ser útil adicionar o -asinalizador ao pgrepqual ele imprime não apenas a identificação do processo, mas também o comando (incluindo argumentos). Dessa forma, é muito fácil verificar se apenas os processos desejados são correspondidos.
luator
1

Além disso,

kill `pgrep -f "ssh.*-D"`
Barun
fonte
3
Eu acho que isso é equivalente apkill
Michael Mrozek
0

Você pode aproveitar o sistema de arquivos proc para coletar as informações. Por exemplo:

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

Não é perfeito, você desejará uma regex mais exclusiva (especialmente se estiver matando processos), mas echo $proc | awk -F'/' '{ print $3 }'mostrará o PID do (s) processo (s).

Tok
fonte
1
OSX não tem /proc. E já existe uma ferramenta robusta para fazer isso, chamada pgrep(disponível de forma nativa pelo menos no Solaris e Linux).
Gilles 'SO- stop be evil' (