如何在执行失败的CTRL + Z后将进程置于后台?

Léo*_* 준영 10 background stdout

问题很特殊,因为某些键(例如CTRL + Z)停止工作.

我尝试通过输入顺序将过程置于后台:

  1. 找/
  2. CTRL + Z
  3. BG

但是,我仍然可以看到标准输出.仅执行第一步的唯一区别是命令CTRL + Z不再起作用.当我有未保存的工作并且我的硬盘超过100GB时,这是相当讨厌的.所以

我该如何将流程置于后台?

[细节]

我在Mac上使用第四版Bash.

[尼古拉斯·赖利的克鲁克斯回复]

问题实际上是我不理解运行流程背景的"后果".我无法理解为什么commnands(如CTRL + Z)不适用于后台进程.我仍然可以使用以下命令在另一个shell中终止进程:

ps -ej | awk '! /grep/ && /find/ {print $2}' | xargs kill -9
Run Code Online (Sandbox Code Playgroud)

Nic*_*ley 12

^Z因为最前面的作业现在是shell,而shell通常不会响应,所以无法正常工作SIGTSTP.(如果你真的想暂停一个非登录shell,suspend通常会工作.)

问题似乎是你误解了后台工作的后果.重定向作业的标准输出是不相关的.

事实上,目前还不清楚是什么,你想做的事情.如果你只是想停止find运行,那么fg它和使用^C^\(默认分别发送SIGINTSIGQUIT).

如果你想继续find运行但是抑制它的进一步输出,那么我能想到的最简单的解决方案就是使用bg ; disown ; exit.这将阻止shell杀死其子进程(find)并退出shell; 假设它位于终端窗口的顶层,你会看到更多输出并find继续运行(但你无法与它进行交互).

  • 当然.背景化过程的主要作用是您的*input*(包括信号,如^ Z)不再与该过程交互; 它们与父shell交互.除非编写过程以检查它是否在后台并执行不同的操作,否则仍将从该过程发出输出. (2认同)

Jer*_*ser 6

我用disown.

find / & disown
exit # close the terminal and the command still runs
Run Code Online (Sandbox Code Playgroud)

您也可以在^ Z之后使用disown:

find /
^Z
bg
disown
exit
Run Code Online (Sandbox Code Playgroud)

我相信,disown是一个内置的bash.不确定其他炮弹的替代品.

有关详细信息,请参阅服务器故障的等效答案.


Cha*_*tin 5

您可以在任何类UNIX系统上将操作设置为具有stty的其他键.

$ stty susp Q
Run Code Online (Sandbox Code Playgroud)

将Q作为暂停键代替CTRL-Z.


pax*_*blo 5

后台进程不会断开终端设备的输出,这就是为什么你仍然看到输出,输出可能包含控制字符,这可能会填补你的TTY设置(cat二进制文件是一个很好的方法).

如果您希望作业在后台运行,请执行以下操作:

find / >/tmp/out 2>&1 &
Run Code Online (Sandbox Code Playgroud)

然后在/tmp/out文件结束时检查文件.

  • 不,@ Jeremy,因为它的位置.我的版本将stdout指向文件,然后将stderr指向与stdout(文件)相同的位置.您的建议会将stderr指向与stdout(终端)相同的位置,然后将stdout指向该文件.我很少忽视问题,我宁愿接受教育. (5认同)