后台工作去哪里了?

后台工作去哪里了?

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

答案1

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

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

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

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

答案2

kill可以通过发送适当的信号(例如使用命令)来进一步控制作业。

你可以试试这个:

  • 运行一些长时间运行的命令(yes例如,从其输出中我们可以看到该进程正在运行)
  • Ctrl + Z
  • 确定进程pid:pgrep yes
  • 恢复进程(相当于bgfg)使用:kill -CONT <PID>,其中 <PID>是上一步中确定的进程 ID

答案3

当您按Ctrl+时Z,您不会将进程发送到后台,而是将其设置为睡眠状态。您可以使用fg命令(前台)唤醒它。 Ctrl+将 (19) 信号Z发送SIGSTOP到进程。

你可以证明这一点:

  • 打开两个终端;在其中一个中键入此命令yes running,它将在终端上重复打印“running”“running”“running”
  • Ctrl使用-停止进程Z并使用该命令查找其 PID ps
  • 在第二个终端中输入:kill -19 the_previous_PID,您将看到它对“是”过程产生相同的效果。

如果您键入,kill -l您将看到可以使用的所有信号的列表。

相关内容