启动两个进程并将第一个进程返回到前台,以便可以使用 ctrl-c 将其终止

启动两个进程并将第一个进程返回到前台,以便可以使用 ctrl-c 将其终止

我正在 Bash 脚本中启动两个进程:

运行网络服务器

xdg-open http://$(主机名)/dev-environment

run_webserver 是一个正在进行的进程,所以我需要能够使用 ctrl-c 来终止它。xdg-open 命令只是在浏览器中启动一个页面。如果我用 & 符号分隔这些命令,第二个进程会从第一个进程中夺走“焦点”,我无法再使用 ctrl+c 来终止它……而必须查找并运行pskill -9有什么想法吗?

答案1

&(& 符号)将进程发送到后台。这意味着如果您运行“run_webserver &”,则该进程将在后台运行。

您可以通过查看终端中该进程的作业 ID 将此进程带到前台。

将进程带到前台并终止的步骤

  1. jobs:--> 此命令将列出终端上正在运行的所有进程。

  2. fg:-->此命令将把进程带到前台。

然后您可以使用 ctrl-c 来终止该进程,或者使用任何其他可以终止该进程的序列。

请参阅附件的屏幕截图:-

在此处输入图片描述

按 q 帮助我退出该进程

答案2

可以设置一个陷阱,在退出时杀死后台进程,并等待后台进程。

#!/bin/bash

trap 'kill $!' EXIT
run_webserver &
xdg-open "http://$HOSTNAME/dev-environment"
wait

或者,在后台运行其他命令

#!/bin/bash

xdg-open "http://$HOSTNAME/dev-environment" &
run_webserver

也可以看看http://mywiki.wooledge.org/ProcessManagement

答案3

fg将会把最近的进程返回到前台。fg -将会把倒数第二个进程返回到前台。

此外,您只能kill -9在所有其他方法都失败后才将其用作最后的手段,因为 SIGKILL (-9) 不允许程序在退出前进行任何清理。首先,直接发送kill,这相当于kill -TERM。如果等待一段时间后失败,请发送 SIGHUP: kill -HUP。只有在这些信号失败后,您才应该尝试 SIGKILL。

相关内容