3

Я запустил программу в Linux, используя & и disown .
Я хотел бы увидеть, если он все еще работает и, возможно, убить его.

Я начал процесс с такими командами:

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

[1] 29144

(env)bash-4.2$ disown

Я больше не могу найти его с помощью ps aux и убить его на основе pid 29144 .
Я хочу знать, если процесс все еще работает (под init?).

Я надеюсь, что вы можете помочь!

3 ответа3

4

Вкратце

С & и disown вы не меняете PID [ 1 ] процесса.
Если вы не видите его в ps -p <YOURPID> , он больше не работает.
Вы можете перепроверить это с дополнительным echo $? [ 2 ] после команды ps (или kill), проверка завершения программы с кодом выхода, отличным от 0 (обычно 1).

Понимание ваших команд.

  • Фон: когда вы запускаете команду с финалом & отправляете ее в фоновом режиме.
    Это означает, что:

    • Он присутствует в списке заданий вашей оболочки (в вашем примере это число [1] и вы можете ссылаться на него как %1 ; (попробуйте команду jobs).
    • Вы можете перенести его на передний план и на задний план с помощью fg и bg .
    • Он (все еще) "принадлежит" оболочке (связанной с родительской): если оболочка получает сигнал SIGHUP , она также отправит сигнал SIGHUP процессу.

      $ 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: с помощью команды disown вы удаляете задание из списка заданий оболочки, но не меняете его 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 
    

    Обратите внимание на тот же PPID (оболочка все еще существует).
    Теперь мы убиваем снаряд.

    $ 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
    

    Есть еще один PPID , 5339 , который при другом вызове ps , ps -p 5339 , вы обнаружите, что он является экземпляром init:

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

pstree: более быстрый путь.

Вы можете увидеть с pstree быстрее.

Перед тем как disown и убить команды bash :

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

После disown и убийства

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

Примечание: конечно, все PID в вашем случае будут разными ...

1

Если он не в ps auxf , то он не работает. Если вы запустите kill 29144 и получите сообщение "Нет такого процесса", это также означает, что процесс не запущен.

1

Каждый процесс имеет папку в файловой системе /proc со своим pid . Если папка не существует, процесс не выполняется.

Например

/proc/29144/

Вы можете просмотреть commandline процесса

cat /proc/29144/cmdline

пример вывода:

/usr/sbin/smbd

или проверьте статус файла процесса

stat /proc/29144/exe

пример вывода:

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: -

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .