我正在尝试编写一个 shell 脚本,检查是否有 2 个不同的进程正在运行,如果没有,则重新启动它们。我只想保持简单。这是正确的方法吗,因为看起来第二部分不起作用……
trap "exit" SIGINT
while true :
do
./stream.sh
echo "Stream has Crashed"
done
trap "exit" SIGINT
while true :
do
./current_song.sh
echo "Current Song has Crashed"
done
答案1
有几个问题:
- 剧本从未超越第一部分
done
,这是第二部分不起作用的主要原因。 - 没有舍邦。
while true :
很奇怪。true
和:
都是 Bash 的内置函数,均返回 true。鞋底while true
就够了,和一样while :
。看来你想要(?) 同时使用这两种变体,这段代码甚至可以“工作”,即它不会失败。它不会失败,因为:
你的这个不是我提到的内置函数;它是true
命令的一个参数。true
丢弃其命令行参数。true :
或true almost anything
相当于true
,所以你的while true :
工作方式就像while true
。
从一个脚本重新启动许多独立进程的方法是这样的:
#!/bin/bash
trap "kill 0" SIGINT
while :; do process1; done &
while :; do process2; done &
# ...
while :; do processN; done
这将while
在单独的 shell(N-1 个子 shell 和主 shell)中执行 N 个循环,因此每个循环都独立并行运行。对于您的情况,脚本可能是:
#!/bin/bash
trap "kill 0" SIGINT
while :
do
./stream.sh
echo "Stream has Crashed"
done &
while :
do
./current_song.sh
echo "Current Song has Crashed"
done
陷阱杀死(试图杀死)所有后代,这要归功于这个kill 0
技巧:
当前进程组中的所有进程都已收到信号