Como verificar se o processo já está em execução ou não

32

Quero verificar o processo específico em execução ou não.

Consultei estas perguntas e respostas .

Mas não obtive nenhuma solução específica. A seguir está o exemplo que eu tentei: Criei o abc.sharquivo e executei este script em segundo plano, como sh abc.sh &.

Agora este arquivo está sendo executado em segundo plano e eu aciono o ps aux | grep "abc"comando.

A seguir está a saída deste comando:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Depois disso, paro o abc.shscript em execução e aciono o mesmo ps aux | grep "abc"comando.

Mas estou obtendo a mesma saída como:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Existe alguma outra maneira de encontrar o processo em execução ou não?

Prakash V Holkar
fonte

Respostas:

41

Todo processo será listado na saída de ps aux; seja correndo, dormindo, zumbi ou parado.

No entanto, no seu caso, desde que você executou o processo usando sh abc.sh, shé o aplicativo (shell) que está sendo executado e não abc.sh. Portanto, ps auxnão conterá o processo abc.shpor causa do qual grepnão poderia resultar em nenhum resultado.

Portanto, a maneira correta de usá-lo é como:

ps aux | grep sh

Isso também pode retornar outro processo em execução, com a string shem qualquer lugar na saída de ps aux.

Você deve observar que o processo estará "em execução" quando a saída de ps auxtiver STATcomo R. Se for algo diferente disso, não está sendo executado na instância em que você acionou o comando para verificar os processos em execução. Os diferentes estados do processo podem ser encontrados na página de manual do ps:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

Você também pode executar o topcomando para verificar se o processo está em execução ou em suspensão e a quantidade de CPU e RAM que está consumindo. (Isso listará novamente seu processo como sh).

No entanto, se você deseja que seu processo seja listado como abc.sh, deve ter a primeira linha do script que está executando como:

#!/bin/sh

para que o shell saiba qual aplicativo será usado para executar o script (sh, neste caso, altere-o #!/bin/bashpara bash) e forneça permissões executáveis ​​ao processo usando:

chmod +x /path/to/abc.sh

substituindo /path/to/pela localização do abc.sharquivo e, em seguida, execute abc.shusando

/path/to/abc.sh

substituindo novamente /path/to/pelo local do abc.sharquivo.

jobin
fonte
2
Uma pergunta rápida. o que é stat S+significa
Prakash V Holkar
Mas você pode encontrar a diferença entre processos em execução e não em processos através da saída do ps aux | grep filenamecomando.
Avinash Raj
@ TechGuru: Significa que o processo está adormecido em primeiro plano; consulte a página de manual do ps para obter mais informações.
Jobin
@AvinashRaj: Sim, claro que você pode.
Jobin
Eu recebo um erro: Erro, faça o seguinte: mount -t proc proc / proc
IgorGanapolsky
7

Meu problema grepé que é um analisador de linha inteira. No seu exemplo, você está procurando "abc", mas está recuando a instância de grep(que está procurando "abc"). Um pouco circular. Você pode filtrar isso, mas acho tudo isso um pouco perverso.

Eu procuraria awkum pouco de panache.

ps aux | awk '$12=="abc.sh"'

awkdivide as linhas em campos com base em espaço em branco (por padrão). Os campos $ 11 + são as colunas de comando, portanto, se o comando for "sh abc.sh ...", $11será she $12será abc.sh.

Se você deseja controlar a saída ou encadear com Bash's &&e ||operadores, pode, mas precisará ser um pouco mais inteligente. grepsairá com o código de status 1 (falha técnica, gatilhos ||) se nada for encontrado, mas awksempre sairá do código 0. Podemos mudar isso dizendo para sair se encontrar algo e lançar 1 se não encontrar:

ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running

Obviamente, se você se importa apenas em escrever a saída na tela, você pode fazer isso em awk:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'
Oli
fonte
4

A maneira correta de verificar na sessão atual do bash se um processo iniciado em segundo plano, como sh abc.sh &, já está sendo executado ou não, é usar o jobscomando builtin.

Exemplo:

$ sh abc.sh &
[1] 6917
$ jobs
[1]+  Running                 sh abc.sh &

Isso significa que o sh abc.shprocesso iniciado em segundo plano está em execução. Se o processo terminar, você verá algo como:

[1]+  Done                    sh abc.sh

Se você tiver mais processos em execução em segundo plano, poderá restringir a saída apenas ao sh abc.shprocesso usando:

jobs sh

Veja help jobspara mais informações.

O método acima funcionará apenas na sessão atual do bash. Mas se você estiver em outra sessão do bash (por exemplo, em outra janela ou guia do terminal ou em um script), além de:

ps aux | grep "[s]h bin/test.sh"

você pode usar também:

pgrep -a sh

o que me parece mais simples. Se você vir seu comando digitado na saída ( sh abc.shneste caso), isso significa que o processo ainda está em execução. Caso contrário, o processo foi concluído.

Radu Rădeanu
fonte
3

Se o seu script estiver em execução no momento, ele deverá ser mostrado por ps auxcomando. Se não for mostrado por ps, pode haver uma execução de script finalizada no momento.

Saída pscomo essa significa que seu script não está em execução no momento,

$ ps aux | grep hm.sh
avinash   6386  0.0  0.0  15940   932 pts/16   S+   17:34   0:00 grep --color=auto hm.sh

Se aparecer assim, significa que seu script está em execução no momento.

$ ps aux | grep hm.sh
avinash   6454  0.0  0.0  16616  1384 pts/16   S+   17:35   0:00 /bin/bash ./hm.sh
avinash   6535  0.0  0.0  15940   932 pts/27   R+   17:35   0:00 grep --color=auto hm.sh

É tudo baseado no conteúdo do script.

Por exemplo, se você criar um script como este. Ele exibe a mensagem HI em execução. Demora alguns segundos para exibir a saída e foi finalizada depois que produz o resultado final.

#!/bin/bash
echo "HI"

Mas se o seu script assim,

#!/bin/bash
sudo apt-get update

Demora alguns minutos para finalizar o processo. Enquanto isso, se você executar o ps aux | grep filenamecomando, ele será mostrado na saída. Porque o script está em execução no momento.

Avinash Raj
fonte
-2
  • se você quiser verificar todos os processos, use 'top'

  • Se você quiser conhecer os processos executados por java, use ps -ef | grep java

  • se outro processo, basta usar ps -ef | grep xyzou simplesmente/etc/init.d xyz status

  • se através de qualquer código como .shentão./xyz.sh status

Umman
fonte
1
-1 Embora esses comandos sejam úteis em algumas circunstâncias, ainda serão inúteis para alguém que não conhece essas circunstâncias. Em cada caso, você não as explica o suficiente ou sua explicação está errada.
David Foerster
-2

se você simplesmente deseja verificar se há algum processo em andamento, vá para esse diretório e digite ll -trse você vê .csvou .worketc no final do arquivo, então isso significa que está em processo ou não.

Umman
fonte
Esta resposta não faz sentido. A listagem do conteúdo de um diretório não informa se um processo está em execução. A extensão do arquivo .csvé para arquivos delimitados por vírgula que não estão relacionados a um processo em execução.
precisa saber é o seguinte