在Bash中使用suspend命令的实际示例是什么?


12

suspend是Bash中的内置命令。您何时会自然使用此命令并发现它有用?


1
每次派生子进程时,shell都会自行挂起,即运行一个命令(该命令是外部程序,需要fork/exec系统调用)
the_velour_fog

1
在交互式外壳程序中,这允许子进程获得终端的控制权,而父外壳程序却无法与终端交互,这会造成混乱。
the_velour_fog's

2
@velour,但这不需要运行单独的命令来达到这种效果?
ilkkachu '16

@the_velour_fog从技术上讲,在STOP派生子进程时,父shell不会被挂起(不会收到信号)。您的第二点评论也让我有些困惑。
库萨兰达

1
@Kusalananda好的,对wait()我来说听起来很合理。我说过,shell在每次派生子进程时都会自行挂起。我没有说接收任何停止信号,这没有任何意义。
the_velour_fog's

Answers:


14

假设您同时缺少GNU screentmux(以及X11 虚拟控制台),但希望在登录外壳程序和另一个交互式外壳程序之间进行切换。

您将首先在控制台上登录,然后启动一个新的外壳程序,暂时阻止该登录外壳程序。要使登录外壳恢复正常工作,您可以这样做suspend。然后,您将使fg交互式外壳恢复到原来的状态。

实际上,通过作业控制,登录外壳程序可以生成许多交互式外壳程序,作为您可以切换到的后台作业fg %1fg %2等等,但是要返回登录外壳程序,suspend除非需要手动进行操作,否则您将需要使用它kill -s STOP $$

还要注意,交互式外壳程序中的提示符处的Ctrl+ Z不会将其挂起。

编辑:我最初suspend在脚本中使用了一个很长的假设部分,但是由于命令需要作业控制,并且由于非交互式外壳程序通常没有作业控制,因此我删除了该部分。


删除的部分由suspend替换为kill -s STOP $$(这确实不再属于答案,但无论如何对其他人来说可能很有趣):

假设您在脚本中有一个后台进程(一个脚本),并且该后台进程在某个阶段需要停止并等待父进程告诉它继续进行。这样做可能是为了使父母有时间提取文件并将其移动到适当位置或类似的位置。

子脚本将暂停(kill -s STOP $$),并且在CONT可以继续时,父脚本将向其发送信号。

它为您提供了在父进程和子进程之间实现某种同步的机会(尽管非常基本,因为父shell进程或多或少需要猜测子进程已挂起,尽管可以通过让子进程来解决此问题。陷阱,CONT并且如果信号接收得太早则不暂停)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.