killall5 – send a signal to all processes e curiosidade do pidof

Como primeiro post do ano de 2011, fica a dica para que tomem cuidado quando estiverem matando processos, usando kill e killall, para nunca apertarem TAB e auto-completar a palavra “killa<TAB>” com o comando killall5 caso seu linux não tenha o killall.

Este comando, quando executado sem parâmetros, mata todos os processos do linux exceto threads do kernel e na sua própria sessão onde foi iniciado o killal5.
Também nunca digite killall5 –help pois o sistema não lhe retornará a ajuda, e sim enviar o sinal de finalização a todos os processos.
Um belo problema para um sistema em produção, não acha? (Sim, isso aconteceu comigo recentemente)

Conclusão: A não ser que realmente queira rebootar o seu Linux em seguida, use o killall5.

Curiosidade: O famoso comando pidof (estilo o pgrep) é um link simbólico para o killall5, como podemos ver no which abaixo:

[hudson@vostrolab ~]$ ls -la `which pidof`
lrwxrwxrwx. 1 root root 8 Jul 13 15:31 /sbin/pidof -> killall5

Como podemos explicar então o fato de que se executarmos somente o comando pidof sem parâmetros, o comportamento que temos é diferente do killall5 executado sem parâmetros ???

A explicação:

Segundo informações encontradas nas referências deste post, o pidof é implementado dentro do binário do killall5. Veja na referência do koders.com onde tem o código fonte do binário killall5 (killall5.c) que na função main ele distingue como o binário foi executado: chamando por killall5 ou por pidof. Para cada uma das opções ele chama uma função interna diferente (grifei no trecho do código abaixo):

/* Main for either killall or pidof. */
int main(int argc, char **argv)
{
PROC *p;
int pid, sid = -1;
int sig = SIGKILL;

/* Get program name. */
if ((progname = strrchr(argv[0], ‘/’)) == NULL)
progname = argv[0];
else
progname++;

/* Now connect to syslog. */
openlog(progname, LOG_CONS|LOG_PID, LOG_DAEMON);

/* First get the /proc filesystem online. */
mount_proc();

/* Were we called as ‘pidof‘ ? */
if (strcmp(progname, “pidof”) == 0)
return main_pidof(argc, argv);

/* Right, so we are “killall“. */
if (argc > 1) {
if (argc != 2) usage();
if (argv[1][0] == ‘-‘) (argv[1])++;
if ((sig = atoi(argv[1])) <= 0 || sig > 31) usage();
}

Com cautela, faça seus testes…
Me coloco a disposição para responder comentários e fazer o possível para sanar dúvidas se surgirem.

Por: Hudson Murilo dos Santos
Referências: http://linuxshellaccount.blogspot.com/2008/08/finding-running-process-ids-on-linux.html
man killall5
man pidof
http://www.mtm.ufsc.br/~krukoski/pub/linux/focalinux2/ch-run.htm
http://www.koders.com/c/fidD2F955BDD8A33E36354F5F3B4B0B98711D8845C0.aspx?s=lastb

2 thoughts on “killall5 – send a signal to all processes e curiosidade do pidof

  1. Muito obrigado por compartilhar sua experiência!

    Isso é muito importante mesmo. Já usei o Kill várias vezes e não sabia disso.

    Agora ficarei esperto.

    Obrigado

    Clovis Roncon – TrustUX Network – TI Security

Leave a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *