![一个脚本中两个长时间运行的程序只需按一次 Ctr-c 即可取消](https://linux22.com/image/1295853/%E4%B8%80%E4%B8%AA%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%B8%A4%E4%B8%AA%E9%95%BF%E6%97%B6%E9%97%B4%E8%BF%90%E8%A1%8C%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%8F%AA%E9%9C%80%E6%8C%89%E4%B8%80%E6%AC%A1%20Ctr-c%20%E5%8D%B3%E5%8F%AF%E5%8F%96%E6%B6%88.png)
我是一名 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。两个进程都应该终止。