将一个正在运行的程序放到后台
16 December 2017

https://stackoverflow.com/questions/625409/how-do-i-put-an-already-running-process-under-nohup

shell 中对程序的操作有如下几个

ctrl+z            # send process to background
bg                # background to frontend
disown -h %1      # 取消 hup 信号

命令在终端运行的时候,如果终端断开了,即操作者关闭了运行窗口,那么程序会收到一个 hup 信号,这个信号的默认行为是关闭程序。
可以用以下方法来解决

  1. disown -h %N 来忽略这个 signal
  2. 在程序一开始运行的时候加一个 nohup,即 nohup my_command
  3. 在程序运行的时候加 nohup, nohup -p PID

注:
disown -h %1 表示 对第一个 job 不发送 hup 信号 (-h 在这里不是 help 的意思,是 hup)

另外,单单是 disown -h 是没用的, ctrl+z 之后,程序是处于 STOP 状态,不会运行,需要让程序恢复运行

➜ kill -20 PID (SIGSTP, STOP process)
➜ kill -18 PID (SIGCONT, CONTINUE process)

因此,让一个正在程序放到后台执行的步骤是

  1. ctrl+z
  2. disown -h %1
  3. kill -18 PID

另外 disown 的操作也可以用 nohup -p PID 命令来代替