协慌网

登录 贡献 社区

如何在 nohup 下放置已经运行的进程?

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

我怎么把它放在 nohup 下(也就是说,即使关闭终端,如何让它继续运行?)

答案

使用 bash 的Job Control将进程发送到后台:

  1. 按 Ctrl + Z停止(暂停)程序并返回 shell。
  2. bg在后台运行它。
  3. disown -h [job-spec]其中 [job-spec] 是作业编号(如第一个正在运行的作业的%1 ; 使用jobs命令查找您的编号),以便在终端关闭时不会终止作业。

假设由于某种原因, Ctrl + Z也无法正常工作,转到另一个终端,找到进程 ID(使用ps )并运行:

kill -SIGSTOP PID 
kill -SIGCONT PID

SIGSTOP将暂停该过程, SIGCONT将在后台恢复该过程。所以现在,关闭两个终端并不会停止你的过程。

将运行的作业与 shell 分离的命令(= 使其成为 nohup)被disown并且是一个基本的 shell 命令。

从 bash-manpage(man bash):

disown [-ar] [-h] [jobspec ...]

如果没有选项,则会从活动作业表中删除每个 jobspec。如果给出了 - h 选项,则不会从表中删除每个 jobspec,但会对其进行标记,以便在 shell 收到 SIGHUP 时不会将 SIGHUP 发送到作业。如果不存在 jobspec,并且未提供 - a 和 - r 选项,则使用当前作业。如果未提供 jobspec,则 - a 选项表示删除或标记所有作业; 没有 jobspec 参数的 - r 选项将操作限制为正在运行的作业。除非 jobspec 未指定有效作业,否则返回值为 0。

那意味着,这很简单

disown -a

将删除作业表中的所有作业并使其成为 nohup