一个脚本中两个长时间运行的程序只需按一次 Ctr-c 即可取消

一个脚本中两个长时间运行的程序只需按一次 Ctr-c 即可取消

我是一名 Web 开发人员,在 Web 开发过程中运行两个脚本。一个用于监视 CSS 更改,另一个用于监视 JS 更改。当检测到更改时,它会合并并连接相应的文件。您可以通过 Ctr-c 并停止每个进程来停止“监视”更改。

我只是使用 Tmux 窗口来运行这些脚本,但其他不使用 screen 或 tmux 的开发人员要求将这些“监视”shell 脚本合并到一个文件中。我不确定如何做到这一点,因为当我将它们合并时,只有一个进程运行,而当我按 Ctrl-c 时,另一个进程开始监视。最好有一种方法可以让它们通过一个调用工作,并在发送停止调用时停止两个进程。

我假设我需要在这里进行分叉,但不确定如何进行。脚本使用标准 bash 并适用于所有基于 Unix 的系统。以下是目前的代码:

#!/bin/sh                                                                                                                                                                                                                                                                                                                                                                 
# Watch for js template changes.
./template-watch.sh                                                                                                                                                                                                                                                                                                                                                       

# Watch for changes in sass files and render them to CSS files.                                                                                                                                                                                                                                                                                                           
sass --watch --style=compressed ../src/scss:../assets/css      

答案1

我认为,您可以在后台运行脚本(使用 &),从 $! 存储它们的 pid。然后您可以等待该进程完成。为了终止这两个脚本,您可以在终止信号上设置陷阱并终止所有后台进程。

#!/bin/sh

kill_background_processes() {
    kill $template_watch_pid $sass_pid
}    
trap kill_background_processes SIGINT SIGTERM

# Watch for js template changes.
./template-watch.sh &
template_watch_pid=$!

# Watch for changes in sass files and render them to CSS files.
sass --watch --style=compressed ../src/scss:../assets/css &
sass_pid=$!

wait $template_watch_pid $sass_pid

这个功能有效 - 我已经测试过了。只需运行此命令,最后按 Ctrl + C。两个进程都应该终止。

相关内容