Geralmente, acho pgrep
mais conveniente do que ps | grep
. Você também pode querer olhar para killall
se o objetivo final é explodir um monte de processos pelo nome.
Estou tentando corrigir um problema com o nginx e acho que existe um processo nginx em execução na minha máquina. Quando eu executo este comando, recebo esta saída.
$ ps aux -P | grep nginx
1000 3947 0.0 0.0 13596 932 pts/0 S+ 14:05 0:00 grep --color=auto nginx
Mas se eu tentar matar os processos 1000, 3947, 13596 ou 932, recebo erros como:
bash: kill: (1000) - No such process
O que está acontecendo? Como faço para encontrar e matar o processo nginx?
Geralmente, acho pgrep
mais conveniente do que ps | grep
. Você também pode querer olhar para killall
se o objetivo final é explodir um monte de processos pelo nome.
ps aux -P
mostra estas colunas:
$ ps aux -P | head -1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
Apenas a segunda coluna é o pid.
Atenção: não tente matar pids aleatórios.
pid 3947 foi o processo do grep que terminou quando você recebeu o seu prompt, então não existe esse processo.
Se houvesse um processo nginx, você o teria visto na saída do grep. Conclusão: O nginx não está sendo executado em sua máquina.
Um truque comum para evitar que o comando grep
seja exibido em ps
output é colocar o primeiro caractere em uma classe de caracteres para que ele não corresponda ao seu literal. Ou seja,
$ ps aux | grep [n]ginx
Dessa forma, o padrão grep
corresponderá a "nginx", mas não ao literal "[n] ginx" exibido na saída ps
.
But if I try to kill processes 1000, 3947, 13596 or 932 I get errors like [...]
na saída de ps
, 1000 é o ID do usuário do processo ( grep
nesse caso), 3947 é o PID de grep
e os outros números são valores de parâmetro de status e nem todos os PIDs .
Se você quiser ver todos os processos pelo nome, use algo como
ps -lfC nginx
ressalva: você precisa saber o nome exato, senão o ps não retorna nada. Se você não sabe o nome exato, use pgrep
.
Muitas vezes você deve usar sudo
para gerenciar nginx
process. Pré-carregue todos os comandos abaixo com sudo
se você obteve o erro 'Operação não permitida'. Embora essa questão seja marcada como 'ps', gostaria de mencionar as outras oportunidades.
Caso você queira apenas parar o nginx, eu recomendaria o uso de:
service nginx stop
Mas se o seu propósito é encontrar o próprio 'pid' (para enviar um sinal, por exemplo) eu recomendo procurar por nginx.pid
. Uma vez que o nginx é iniciado, ele coloca o pid neste arquivo.
nginx
can be controlled with signals. The process ID of the master process is written to the file /usr/local/nginx/logs/nginx.pid by default
Pode estar em outro lugar, no entanto.
Caso você tenha compilado o nginx por youself , você pode ter especificado pid-path
também.
--pid-path=path
— sets the name of annginx.pid
file that will store the process ID of the main process. After installation, the file name can always be changed in the nginx.conf configuration file using the pid directive. By default the file is named prefix/logs/nginx.pid
Caso contrário, você pode especificar o caminho para o arquivo pid explicitamente em nginx.conf
.
Leia sobre Controle de Nginx
Então, para enviar um sinal, basta digitar:
kill 'cat /path/to/nginx.pid'
Ou
kill $(cat /path/to/nginx.pid)
Leia sobre a eliminação do processo por arquivo pid .
Pessoalmente, escrevendo script ou instruções de implantação, eu não confiaria parar ou pesquisar nginx pid em pgrep
e especialmente em grep
, embora eles sejam aplicáveis na máquina local. Mas neste caso eu encurtaria a parada para pkill
(kill do processo):
pkill nginx
na maioria das instalações do nginx você pode encontrar o pid no sistema de arquivos: cat /var/run/nginx.pid
Para matar todos os processos nginx que você poderia fazer:
kill $(ps aux | grep 'nginx' | awk '{print $2}')
Execute este comando:
sudo kill -9 $(ps aux | grep 'nginx' | awk '{print $2}')
Tags ps