Linux: visualize e elimine processos rejeitados

1

Eu iniciei um programa no Linux usando & e disown .
Eu gostaria de ver se ainda está funcionando e possivelmente matá-lo.

Eu iniciei o processo com comandos como estes:

(env)bash-4.2$ python manage.py update_rollups &

[1] 29144

(env)bash-4.2$ disown

Eu não consigo mais encontrá-lo com ps aux , nem o matar com base no pid 29144 .
Eu quero saber se o processo ainda está em execução (em init ?).

Espero que você possa ajudar!

    
por user715198 07.04.2017 / 12:26

3 respostas

2

Em resumo

Com & e disown você não altera o PID [ 1 ] do processo

Se você não vê-lo na saída ps -p <YOURPID> , não está mais em execução.
Você pode checar demais com um adicional echo $? [ 2 ] após o comando ps (ou kill ), verificando se o programa sai com um código de saída diferente de 0 (normalmente 1 ).

Entendendo seus comandos.

  • Plano de fundo : quando você iniciar o comando com o% final & , envie-o em segundo plano.
    Isso significa que:

    • Ele está presente na lista de trabalhos do seu shell (no seu exemplo está o número [1] e você pode se referir a ele como %1 ; (tente o comando jobs ).
    • Você pode colocá-lo em primeiro plano e em segundo plano com fg e bg .
    • É (ainda) "propriedade" pelo shell (ligado ao pai): se o shell receber um sinal SIGHUP , ele enviará um sinal SIGHUP para o processo também .

      $ sleep 1h &
      [1] 10795
      $ jobs
      [1]+  running           sleep 1h & 
      $ ps -l -p 10795       
      F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
      0 S  1000 10795  8380  0  80   0 -  3107 hrtime pts/57   00:00:00 sleep
      
  • Disown : com o comando disown , você remove o trabalho da lista de trabalhos do shell, mas não altera seu PID.

    $ disown
    $ jobs
          # <---- No jobs
    $ ps -l -p 10795
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    0 S  1000 10795  8380  0  80   0 -  3107 hrtime pts/57   00:00:00 
    

    Observe o mesmo PPID (o shell ainda existe).
    Agora nós matamos a casca.

    $ kill 8380   # Here we kill the shell 
    $ ps -l -p 10795
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    0 S  1000 10795  5339  0  80   0 -  3107 hrtime pts/57   00:00:00 sleep
    

    Há outro PPID , o 5339 , que com outra invocação de ps , ps -p 5339 , você descobrirá como uma init instance:

    $ ps -p 5339
    PID TTY          TIME CMD
    5339 ?        00:02:20 init
    

pstree : uma maneira mais rápida.

Você pode ver com pstree mais rapidamente.

Antes dos comandos disown e matar o bash :

$ pstree -s -p 10795 
init(1)───lightdm(1199)───lightdm(5259)───bash(8380)───sleep(10795)

Após o disown e matar o bash :

$ pstree -s -p 10795 
init(1)───lightdm(1199)───lightdm(5259)───init(5339)───sleep(10795)

Nota: é claro que todos os PIDs no seu caso serão diferentes ...

    
por 07.04.2017 / 13:33
1

Cada processo tem uma pasta no sistema de arquivos /proc com seu pid . Se a pasta não existir, o processo não está em execução.

Por exemplo

/proc/29144/

você pode ver o processo commandline

cat /proc/29144/cmdline
Exemplo de saída

:

/usr/sbin/smbd

ou verifique o status do arquivo de processo

stat /proc/29144/exe
Exemplo de saída

:

File: /proc/29144/exe -> /usr/sbin/smbd
  Size: 0               Blocks: 0          IO Block: 1024   symbolic link
Device: 3h/3d   Inode: 78497       Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-04-07 12:18:01.719011505 +0200
Modify: 2017-04-07 12:18:01.369010535 +0200
Change: 2017-04-07 12:18:01.369010535 +0200
 Birth: -
    
por 07.04.2017 / 13:21
0

Se não estiver em ps auxf , então não está em execução. Se você executar kill 29144 e obter "Nenhum tal processo", isso também significa que o processo não está em execução.

    
por 07.04.2017 / 12:33