Qual é a diferença entre 'killall' e 'pkill'?

87

Depois de usar apenas kill <some_pid> em sistemas Unix por muitos anos, eu aprendi pkill de um colega mais jovem com colega de trabalho do Linux 1 . p>

Eu logo aceitei o caminho do Linux, pgrep -ing e pkill -ing através de muitos dias e noites, através de desacelerações e condições de corrida. Tudo isso estava bem e bem.

Mas agora não vejo nada além de killall . Os manuais parecem mencionar apenas killall , e não tenho certeza se isso é algum tipo de desenvolvimento paralelo, ou se killall é um sucessor de pkill ou outra coisa.

Parece funcionar como um pkill mais segmentado, mas tenho certeza de que estou perdendo alguma coisa.

Uma pessoa com conhecimento do Ubuntu / Debian 2 pode explicar quando (ou por que) killall deve ser usado, especialmente se deve ser usado em vez de pkill (quando pkill frequentemente parece mais fácil, porque eu posso ser desleixado com a correspondência de nomes, pelo menos por padrão).

Quando falo de killall , não estou pensando no comando que em alguns sistemas Unix (Solaris, AIX,?) mataria todos os processos do usuário. Aqui está uma descrição dessa versão, de uma página man do AIX da IBM :

  

O comando killall cancela todos   processos que você iniciou, exceto   aqueles que produzem o processo killall.   Este comando fornece uma   meios de cancelar todos os processos   criado pelo shell que você controla.   Quando iniciado por um usuário root, o   O comando killall cancela tudo   processos canceláveis, exceto aqueles   processos que o iniciaram. Se vários   Os sinais são especificados, apenas o último   um é eficaz.

1 'colega' é atualização gratuita de 'colega de trabalho', assim também pode. 2 Originalmente eu pensei que isso fosse coisa de Linux ou Debian , mas algumas fontes estão dizendo que o Linux killall é derivado do Unix com sabor BSD.

    
por belacqua 22.02.2011 / 08:31

4 respostas

63

Eu acho que você vê killall em instruções porque, por padrão, ele requer o nome exato do processo, enquanto o pkill faz a correspondência básica de padrões. Assim, o killall é mais seguro para os usuários copiarem e colarem cegamente.

Pkill e killall ambos têm opções de distinção. Killall tem uma flag para combinar com a idade do processo, pkill tem um flag para matar apenas processos em um dado tty. Etcetera ad nauseum. Nem é melhor , eles só têm diferentes especialidades.

Eu vejo em suas páginas man que o killall vem do pacote psmisc , que tem vários utilitários de gerenciamento de processo, mas notavelmente não contém ps . É o pacote procps que tem ps, top, kill e pkill (entre outros). Eu aposto que o process não originalmente tinha pkill, então psmisc arranhou uma coceira e veio com killall.

A página man do pkill / pgrep diz que eles foram introduzidos no Solaris 7. Como você mencionou, jgbelacqua , o killall do Solaris não era o utilitário que o psmisc fornece, portanto, o Solaris provavelmente só tinha o pacote procps. Alguém queria uma ferramenta de processo de correspondência de padrões, assim pkill e pgrep. Se foi desenvolvido pelo desenvolvedor ou adicionado posteriormente, não sei. Independentemente disso, ele se tornou parte de * nixes em todos os lugares.

Mais fontes:

por djeikyb 22.02.2011 / 09:06
7

Por favor, tenha cuidado com o "killall". Em alguns sistemas (esqueço qual), o killall mata todos os processos. Irá ignorar silenciosamente os argumentos e interromper completamente o seu sistema.

    
por phessler 30.07.2012 / 10:26
3

se você ativar / etc / bash_completion, depois de killall <part_of_process_name> e pressionar tab - auto, conclui o nome do processo na lista de processos em execução

    
por jet 22.02.2011 / 13:28
2

Se você olhar as opções em ambos os programas, verá que ambos fazem a mesma coisa, mas de maneiras diferentes.

pkill realizará correspondência em vários atributos de um processo (CMD, PID, PPID, UID ...) e enviará o sinal fornecido para cada processo correspondente. (Para o CMD, uma expressão regular é usada, para outras, é uma string). O pkill não é interativo, mas é melhor para programas em lote.

killall executará correspondência no nome do processo (comm) ou usuário (usuário), e não na cadeia de comando inteira. O argumento é usado como uma string simples e deve corresponder a todo o valor 'comm' (há também uma opção --regexp para alterar isso). O killall tem opções --interactive e --younger-than, o qual pkill não possui.

Existe também um killall5 dos dias do SysV e foi portado para outras variantes do UNIX (supostamente sob o pacote 'sysutils' do Ubuntu). Isso se comporta de maneira diferente da maneira antiga. Isso costumava ser usado internamente nos scripts de inicialização para desligar ou alterar para o modo de usuário único.

    
por Arcege 22.02.2011 / 14:24