Como verificar se o processo já está sendo executado ou não

25

Eu quero verificar o processo específico já em execução ou não.

Eu referenciei este Q & amp; A .

Mas eu não consegui nenhuma solução específica. A seguir, o exemplo que tentei: Eu criei o arquivo abc.sh e executei esse script em segundo plano, como sh abc.sh & .

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

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 script em execução abc.sh e disparei o mesmo comando ps aux | grep "abc" do comando.

Mas estou recebendo 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 descobrir se o processo está sendo executado ou não?

    
por Prakash V Holkar 29.05.2014 / 13:21

6 respostas

33

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) em execução e não abc.sh . Portanto, ps aux não conterá o processo abc.sh , porque grep não pode produzir nenhum resultado.

Então, a maneira correta que você deveria ter usado é como:

ps aux | grep sh

Isso também pode retornar outros processos em execução com a string sh em qualquer lugar na saída de ps aux .

Você deve observar que o processo estará "em execução" quando a saída de ps aux tiver seu STAT como R . Se for algo diferente disso, não está sendo executado na instância em que você disparou o comando para verificar os processos em execução. Os diferentes estados do processo podem ser encontrados na página man 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 comando top para verificar se o processo está sendo executado ou suspenso e a quantidade de CPU, RAM que está sendo consumida. (Isso listará novamente seu processo como sh ).

No entanto, se você quiser que seu processo seja listado como abc.sh , você deve ter a primeira linha do script em execução:

#!/bin/sh

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

chmod +x /path/to/abc.sh

substituindo /path/to/ pela localização do arquivo abc.sh e, em seguida, execute abc.sh usando

/path/to/abc.sh

novamente substituindo /path/to/ pela localização do arquivo abc.sh .

    
por jobin 29.05.2014 / 13:53
5

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

Eu mudaria para awk para um pouco de brio.

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

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

Se você quiser controlar a saída ou a cadeia com os operadores && e || do Bash, você pode, mas precisará ser um pouco mais inteligente. grep sairá com o código de status 1 (falha técnica, aciona || ) se nada for encontrado, mas awk sempre sairá do código 0. Podemos alterar isso dizendo para sair se encontrar algo e lançar um 1 se isso não acontece:

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

É claro que, se você se preocupa em escrever a saída na tela, pode fazer isso tudo em awk :

ps aux | awk '=="abc.sh" {print "running"; exit} END{print "not running"}'
    
por Oli 29.05.2014 / 22:13
3

Se o seu script estiver atualmente em execução, ele deverá ser mostrado pelo comando ps aux . Se não for mostrado por ps , pode haver sua execução de script encerrada no momento.

A saída de ps assim significa que seu script não está sendo executado 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 for exibido assim, o que significa que seu script está sendo executado 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. Exibe a mensagem HI em execução. Leva alguns segundos para exibir a saída e foi terminado depois de produzir o resultado final.

#!/bin/bash
echo "HI"

Mas se o seu script assim,

#!/bin/bash
sudo apt-get update

Demora alguns minutos para que o processo seja encerrado. Nesse meio tempo, se você executar o comando ps aux | grep filename , ele será mostrado na saída. Porque o script está sendo executado no momento.

    
por Avinash Raj 29.05.2014 / 13:33
3

O jeito certo de verificar a sessão bash atual se um processo iniciado em segundo plano, como sh abc.sh & , já está em execução ou não, é usar o comando jobs builtin.

Exemplo:

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

Isso significa que o processo sh abc.sh iniciado em segundo plano está sendo executado. Se o processo tiver terminado, 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.sh process usando:

jobs sh

Veja help jobs para mais informações.

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

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

você também pode usar:

pgrep -a sh

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

    
por Radu Rădeanu 29.05.2014 / 19:52
0

se você quiser simplesmente verificar se há algum processo em processo, vá para esse diretório e digite ll -tr se você vir .csv ou .work etc no final do arquivo, o que significa que não está em processo.

    
por Umman 23.05.2016 / 22:16
-1
  • se você quiser verificar todos os processos, use 'top'

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

  • se outro processo, use apenas ps -ef | grep xyz ou simplesmente /etc/init.d xyz status

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

por Umman 23.05.2016 / 21:55