后台工作去哪里了?

cam*_*eer 5 shell job-control jobs background-process

从 gnome-terminal 我知道可以使用 Cz 暂停作业,然后将其发送到后台。当我关闭终端时,过程并没有结束。工作是从哪里管理的,还是丢失了?

Gil*_*il' 10

您的后台作业将继续执行,直到有人通过向其发送信号来告诉它停止。它可能会以多种方式死亡:

  • 当终端出于任何原因离开时,它会向在其中运行的外壳程序(更准确地说,是控制进程)和前台进程组中的进程发送HUP 信号(“挂断”,如调制解调器挂断)。因此,在后台运行的程序不受影响,但是……
  • 当 shell 接收到 HUP 信号时,它会将其传播到后台作业。因此,如果后台进程没有忽略该信号,它就会在此时死亡。
  • 如果程序在终端消失后尝试从终​​端读取或写入,则读取或写入将失败并显示输入/输出错误 (EIO)。然后程序可以决定退出。
  • 当然,您(或您的系统管理员)可以随时决定终止该程序。

如果您关心的是保持程序运行,那么:

  • 如果程序可能与终端交互,请使用ScreenTmux在虚拟终端中运行程序,您可以随意断开和重新连接。
  • 如果程序只需要继续运行并且不具有交互性,请使用nohup命令 ( nohup myprogram --option somearg)启动它,这可确保 shell 不会向它发送 SIGHUP,将标准输入/dev/null重定向到一个名为nohup.out.
  • 如果您已经启动了该程序并且不希望它在您关闭终端时死掉,请运行disown内置程序(如果您的 shell 有的话)。如果没有,您可以通过以极端偏见杀死 shell(kill -KILL $$从该 shell 绕过指示进程具有的任何退出触发器)来避免 shell 的 SIGHUP 传播。
  • 如果您已经启动了该程序并希望将其重新连接到另一个终端,则有多种方法,但它们并非 100% 可靠。请参阅如何否认正在运行的进程并将其关联到新的屏幕外壳?和相关问题。