bash - Bash 跟随多进程返回
问题描述
我有一个启动多进程的 bash 脚本:
while read p || [[ -n $p ]]; do
hostname=$(echo $p | cut -d';' -f1)
# On lance les actions en background/parallele
ssh "$hostname" "someAction.sh" > "$hostname.status.tmp" &
done < hostnames.prm
每个服务器上的“someAction”脚本需要一些时间才能启动。它逐步返回步骤以说明发生了什么。
我想逐步显示每个进程的每个动作的状态,刷新屏幕。
例子 :
Hostname n°1 :
Step 1 of someAction
Step 2 of someAction
...
Hostname n°2 :
Step 1 of someAction
Step 2 of someAction
Step 3 of someAction
Step 4 of someAction
someAction finished
...
Hostname n°3 :
Step 1 of someAction
...
Hostname n°4 :
Step 1 of someAction
Step 2 of someAction
...
Hostname n°5 :
Step 1 of someAction
Step 2 of someAction
Step 3 of someAction
Step 4 of someAction
someAction finished
因此,我将返回的进度步骤按主机名存储在一个文件中:
ssh "$hostname" "someAction..." > "$hostname.status.tmp" &
但是,如何在至少一个进程正在进行时显示它们?
这似乎很难:/
解决方案
谢谢您的回答。
我只是使用:
clear (go on top of screen)
...
processing=1
actionPids=()
i=0
while read p || [[ -n $p ]]; do
hostname=$(echo $p | cut -d';' -f1)
type=$(echo $p | cut -d';' -f2)
if [[ "$type" = "$ENVIR" || "$ENVIR" = "ALL" || "$hostname" = "$ENVIR" ]]
then
# On lance les actions en background/parallele
doInstance "$hostname" "$ACTION" > "$hostname.status.tmp" &
actionPids[$i]=$!
fi
i=`expr $i + 1`
done < hostnames.prm
lastNbLines=0
tput sc
while [ $processing -eq 1 ]; do
lastNbLinesTmp=$(cat *.status.tmp | wc -l)
if [ $lastNbLinesTmp != $lastNbLines ]; then
tput rc
tput ed
echo "======================================================================================="
fi
while read p || [[ -n $p ]]; do
hostname=$(echo $p | cut -d';' -f1)
type=$(echo $p | cut -d';' -f2)
if [[ "$type" = "$ENVIR" || "$ENVIR" = "ALL" || "$hostname" = "$ENVIR" ]]
then
if [ $lastNbLinesTmp != $lastNbLines ]; then
echo -e "${cBold}Server $hostname :${cNone}"
cat "$hostname.status.tmp"
fi
fi
done < $OAAPATH/hostnames.prm
processing=0
for actionPid in "${actionPids[@]}"
do
if kill -0 $actionPid 2>/dev/null ; then
processing=1
fi
done
**sleep 1**
lastNbLines=$lastNbLinesTmp
done
# Wait for all process to finish before exit
wait
rm *.status.tmp
[ $RET_SUM -ne 0 ] && exit 1
exit 0
它完美地工作。
这有点复杂,但我认为没有真正最简单的解决方案。
推荐阅读
- angular - 角度订阅中的方法调用超出了组件属性的范围
- python - 如何使用 Python 列出远程主机目录中的文件?
- react-native - 反应原生:尝试获取时为空状态
- postgresql - Postgres 光标目标
- apache-spark - 有没有更好的方法在 Spark 中加载一个巨大的 tar 文件同时避免 OutOfMemoryError?
- r - R 字符向量转化为因子
- python - 索引上一行或下一行时可以避免数据框行循环吗?
- nginx - Nginx 逻辑与运算符
- python-2.7 - 将带有 dict 属性的 JSON 写入 Google Cloud Datastore
- ios - 如何在 Xcode 中的 WebKit 函数上设置符号断点