关于 bash 后台作业的问题

关于 bash 后台作业的问题
  1. 既然即使用户注销,后台作业仍然可以运行,那么使用 nohup 和 screen 有什么意义呢?

  2. CTRL+Z 和 stop 暂停后台作业有什么区别?还有另一个命令“stop”可以停止后台作业。这不会终止作业,但它不会继续执行,直到重新启动。我想知道“stop”和 CTRL+Z 有什么区别?对于“stop”,请参阅http://www.ece.osu.edu/computing/background_jobs.html#commands

  3. 使后台作业变得非交互性,这样正确吗?

command &lt<inputfile> &gt<outputfile>

如果我想将输出附加到现有文件同时保留作业背景怎么办?

答案1

后台作业

常规后台作业在父 shell 终止后无法继续存在:

pigpen ~: yes > /dev/null &

退出后该信息将不复存在。

然而,这将:

pigpen ~: nohup yes &

nohup阻止进程在注销时接收 SIGHUP 信号。

而 Screen 则保持了用户始终登录的假象,并允许用户随时重新连接。这样做的好处是,一旦重新连接,就可以继续与程序交互(仅使用 nohup 则无法实现)。

Ctrl+C

Ctrl+C 向进程发送 SIGINT,进程可能会捕获并忽略该 SIGINT(不常见)。

我建议阅读bash 手册页;特别是有关信号和作业控制的部分。

Ctrl+Z

您修改了问题,改为使用 Ctrl+Z。Ctrl+Z 向进程发送 SIGTSTP 信号,将其暂停。稍后可以通过向其发送 SIGCONT 信号来继续此进程。

SIGTSTP 信号可以被程序捕获并忽略。

SIGSTP 信号

SIGSTP 信号与 SIGTSTP 不同,它不能被正在运行的程序捕获。它的行为与未捕获的 SIGTSTP 的行为相同。

资源

答案2

  1. 后台作业只有在您将其分离后才会继续(我相信),并且您以后无法获得输出或向其发送输入。 Screen 会让您以后连接到它,就像您从未离开过它一样。
  2. Control+c 是键盘中断,它所做的就是向正在运行的程序发送信号,该程序通常会通过退出来响应,但不会强制这样做。停止它会发送不同的信号,应用程序通常会停止正在执行的操作,直到收到继续信号(这可以通过 control+z 来完成)。

答案3

  1. 如果您退出启动后台作业的 shell(例如 SSH),那么后台作业将会终止。这就是您使用 nohup 或 screen 的原因。如果您有现代 bash shell,则有一个 disown -h 命令。有关更多信息,请参阅 bash 的手册页
  2. Ctrl-C 和 suspend 不同。Ctrl-C 终止进程。
  3. 要将输出附加到现有文件: 1>>/path/existing_file
  4. ctrl-Z 暂停进程,将其带入后台并将控制权交还给您。我不知道你的“stop”的确切含义
  5. 附加输出并置于后台: command 1>>/path/existing_file &

相关内容