如何使用另一个 shell 脚本一个接一个地 运行 多个 shell 脚本
how to run multiple shell scripts one by one in single go using another shell script
亲爱的专家们,我有一个小问题...我正在尝试一次性 运行 多个 shell 具有相同扩展名 (.sh) 的脚本,这些脚本存在于一个目录中。到目前为止,我写了一个如下所示的通用脚本。但问题是它没有完成 运行ning 而是一直 running.I 无法找出问题所在 persist.I 希望有高手可以研究一下。我的小代码如下。如果我做类似 bash scriptone.sh, bash scriptkk.sh
的事情,它工作正常,但我不想手动方式做 it.Thanks。
#!/bin/sh
for f in *.sh; do
bash "$f" -H
done
你可能在递归调用自己
#!/bin/sh
for f in *.sh; do
if [ "$f" == "[=10=]" ]; then
continue
else
echo "running: $f"
bash "$f" -H
fi
done
您正在 运行按顺序排列它们。
也许其他脚本之一仍在运行?
尝试在后台启动它们。
简单版-
for f in *.sh; do bash "$f" -H & done
如果有任何输出,这将是一团糟。同样,如果您注销,它们也会崩溃。这是处理此类事情的详细版本 -
for f in *.sh; do
nohup bash "$f" -H <&- > "$f.log" 2>&1 &
done
末尾的 &
将其置于后台,以便循环可以开始下一个循环,而无需等待当前 $f
完成。 nohup
捕获 SIGHUP,因此如果需要很长时间,您可以断开连接并稍后再回来。
<&-
关闭标准输入。 > "$f.log"
为每个脚本提供了自己的日志,这样您就可以单独检查它们,而不会把它们混在一起。 2>&1
只需确保任何错误输出都进入与标准输出相同的日志 - 请注意 stderr 是无缓冲的,而 stdout 是缓冲的,所以如果你的错误似乎在日志中的一个奇怪的地方(太早) , 切换它:
nohup bash "$f" -H <&- 2>"$f.log" 1>&2 &
应该 解除缓冲并整理它们。
为什么你给他们一个相同的 -H
论据?
既然你在下面提到你有 5000 个脚本到 运行,这可能解释了为什么要花这么长时间......你可能不想用 [=47= 的所有脚本来破坏服务器]一次。让我们详细说明一下...
至少,我会做这样的事情:
for f in *.sh; do
nohup nice "$f" -H <&- > "$f.log" 2>&1 &
sleep 0.1 # fractional seconds ok, longer pause means fewer per sec
done
这将每秒开始九次或十次,直到所有这些都被处理,并且 nohup nice
将 运行 $f
具有较低的优先级,因此正常的系统请求将能够抢在前面。
更好的解决方案可能是 par
或 parallel
。
亲爱的专家们,我有一个小问题...我正在尝试一次性 运行 多个 shell 具有相同扩展名 (.sh) 的脚本,这些脚本存在于一个目录中。到目前为止,我写了一个如下所示的通用脚本。但问题是它没有完成 运行ning 而是一直 running.I 无法找出问题所在 persist.I 希望有高手可以研究一下。我的小代码如下。如果我做类似 bash scriptone.sh, bash scriptkk.sh
的事情,它工作正常,但我不想手动方式做 it.Thanks。
#!/bin/sh
for f in *.sh; do
bash "$f" -H
done
你可能在递归调用自己
#!/bin/sh
for f in *.sh; do
if [ "$f" == "[=10=]" ]; then
continue
else
echo "running: $f"
bash "$f" -H
fi
done
您正在 运行按顺序排列它们。
也许其他脚本之一仍在运行?
尝试在后台启动它们。
简单版-
for f in *.sh; do bash "$f" -H & done
如果有任何输出,这将是一团糟。同样,如果您注销,它们也会崩溃。这是处理此类事情的详细版本 -
for f in *.sh; do
nohup bash "$f" -H <&- > "$f.log" 2>&1 &
done
末尾的 &
将其置于后台,以便循环可以开始下一个循环,而无需等待当前 $f
完成。 nohup
捕获 SIGHUP,因此如果需要很长时间,您可以断开连接并稍后再回来。
<&-
关闭标准输入。 > "$f.log"
为每个脚本提供了自己的日志,这样您就可以单独检查它们,而不会把它们混在一起。 2>&1
只需确保任何错误输出都进入与标准输出相同的日志 - 请注意 stderr 是无缓冲的,而 stdout 是缓冲的,所以如果你的错误似乎在日志中的一个奇怪的地方(太早) , 切换它:
nohup bash "$f" -H <&- 2>"$f.log" 1>&2 &
应该 解除缓冲并整理它们。
为什么你给他们一个相同的 -H
论据?
既然你在下面提到你有 5000 个脚本到 运行,这可能解释了为什么要花这么长时间......你可能不想用 [=47= 的所有脚本来破坏服务器]一次。让我们详细说明一下...
至少,我会做这样的事情:
for f in *.sh; do
nohup nice "$f" -H <&- > "$f.log" 2>&1 &
sleep 0.1 # fractional seconds ok, longer pause means fewer per sec
done
这将每秒开始九次或十次,直到所有这些都被处理,并且 nohup nice
将 运行 $f
具有较低的优先级,因此正常的系统请求将能够抢在前面。
更好的解决方案可能是 par
或 parallel
。