如何将已经运行的进程置于 nohup 下?

我有一个已经运行很长时间的进程,不想结束它。

如何将其置于 nohup 下(即,即使关闭终端,如何使它继续运行?)

答案

使用 bash 的作业控制将流程发送到后台:

  1. Ctrl + Z停止(暂停)程序并返回外壳。
  2. bg在后台运行它。
  3. disown -h [job-spec] ,其中 [job-spec] 是作业编号(例如,第一个正在运行的作业为%1 ;使用jobs命令查找您的编号),以便在终端关闭时不会杀死该作业。
kill -SIGSTOP PID 
kill -SIGCONT PID
disown -a
%  jobs
[1]  running java 
[2]  suspended vi
%  disown %1
nohup -p pid
$./loop.sh
$ gdb -p <PID>
T Stopped, either by a job control signal or because it is being traced
    + is in the foreground process group

(gdb) call close(1)
$1 = 0
(gdb) call open("loop.out", 01102, 0600)
$6 = 1
loop.sh <PID> truey    1u   REG   0,26        0 15008411 /home/truey/loop.out
(gdb) detach
Detaching from program: /bin/bash, process <PID>
(gdb) q
^Z
[1]+  Stopped                 ./loop.sh
$ ps -f 24522
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
<UID>    <PID><PPID>  0 11:16 pts/36   S      0:00 /bin/bash ./loop.sh
$ jobs
[1]+  Stopped                 ./loop.sh
$ bg %1
[1]+ ./loop.sh &
$ disown -h %1
$ ps -f <PID>
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
<UID>    <PID><PPID>  0 11:16 pts/36   S      0:00 /bin/bash ./loop.sh
$ ps -f <PID>
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
<UID>    <PID>     1  0 11:16 ?        S      0:00 /bin/bash ./loop.sh
$ /usr/bin/lsof -p <PID>
...
loop.sh <PID> truey    0u   CHR 136,36                38 /dev/pts/36 (deleted)
loop.sh <PID> truey    1u   REG   0,26     1127 15008411 /home/truey/loop.out
loop.sh <PID> truey    2u   CHR 136,36                38 /dev/pts/36 (deleted)
call close(1)
call open("loop.out", 01102, 0600)
# call close(2)
# call open("loop.err", 01102, 0600)
detach
quit
gdb -q -ex 'call close(1)' -ex 'call open("loop.out", 01102, 0600)' -ex detach -ex quit -p <PID>

要将运行进程发送到 nohup( http://en.wikipedia.org/wiki/Nohup

nohup -p pid ,它对我没有用

然后我尝试了以下命令,效果很好

  1. 运行一些 SOMECOMMAND,例如/usr/bin/python /vol/scripts/python_scripts/retention_all_properties.py 1

  2. Ctrl + Z停止(暂停)程序并返回外壳。

  3. bg在后台运行它。

  4. disown -h以便在终端关闭时不会终止该进程。

  5. 键入exit外壳程序,因为现在您可以执行此操作了,因为该操作将在其自己的进程中在后台运行,因此它与外壳程序无关。

此过程等效于运行nohup SOMECOMMAND

nohup -p  processid>
  1. ctrl + z-这将暂停作业(不会取消!)
  2. bg这会将作业置于后台并在运行过程中返回
  3. disown -a这将削减所有附件的作业(因此您可以关闭终端,它仍将运行)

这些简单的步骤将使您在保持进程运行的同时关闭终端。

它不会把上nohup (根据我对你的问题的理解,你不需要在这里)。

在 tcshell 中,这在 Ubuntu Linux 上对我有用。

  1. Ctrl Z暂停

  2. bg在后台运行

  3. jobs以获取其工作编号

  4. nohup %n ,其中 n 是作业编号