![Bash 进程输出状态](https://linux22.com/image/1431176/Bash%20%E8%BF%9B%E7%A8%8B%E8%BE%93%E5%87%BA%E7%8A%B6%E6%80%81.png)
我想问一下有关在 bash 脚本中创建新进程的问题。
我有脚本,它将执行外部程序测试,然后检查其输出状态并打印测试是否成功。这些测试将按顺序执行。
现在我需要一些其他测试,这些测试脚本会为每个测试创建新的进程,最多有多少个测试进程,假设现在我想并行运行 3 个测试,甚至先按顺序执行测试。我想知道是否有可能将这些单独进程的输出状态返回到我的脚本并记录下来?我需要分别获取每个正在运行的进程的这些值,并且我不想停止这些按顺序运行的进程。这 3 个测试仍将按顺序循环运行。
总而言之,我需要在 bash 中以某种方式创建回归脚本,该脚本将循环运行,TESTS1 将按顺序执行,而 TESTS2 将在后台运行,因为它们的执行时间比 TESTS1 长。但我需要以某种方式在后台运行 TESTS2,检查它们是否仍在运行,将它们的输出状态返回到父脚本以记录值,并并行执行 TESTS1。
现在我使用关联数组记录 TESTS2 子进程的 PID,并测试特定测试 ID 是否正在运行,如果没有,我将重新启动它。但我不知道如何获取它的 ID。因为读取最后一个进程的输出状态不需要是我正在测试的这个测试是否存在。
# Create array
declare -A processes
for test in ${TESTS2[@]};
do
processes[$test]=0
done
# background prcess
fork()
{
OUT=$($TEST)
STATUS=$?
if [ $STATUS -eq 0 ]; then
# do staff if ok
((OK++))
else
# do staff if fail
((FAIL++))
fi
}
# -----------------------------------------------------------------------------
# Repeat Tests i-times
for ((i=1; i<=100; i++))
do
# RUN backgroung proceses
for TEST in ${TESTS2[@]}; do
# check if PID lives
kill -0 ${processes[$TEST]} &> /dev/null
stat=$?
# if 0 or not running run it...
if [[ ${processes[$TEST]} == 0 || $stat > 0 ]]; then
fork $TEST $cnt &
processes[$TEST]=$! # log PID
fi
done
# Cycle through TESTS1
for TEST in ${TESTS1[@]}; do
OUT=$($TEST)
STATUS=$?
if [ $STATUS -eq 0 ]; then
# do staff if ok
((OK++))
else
# do staff if fail
((FAIL++))
fi
echo -ne "** NOTE: Running Regress Tests: Cycle: $i PASS: $ccount FAIL: $fcount ...\r"
done
有人有什么想法吗?谢谢
答案1
要获取后台进程的退出代码,请使用wait
:
$ (sleep 1; false) & pid_1=$!; (sleep 1; true) & pid_2=$!
[1] 29111
[2] 29112
$ wait $pid_1
$ echo $?
1
$ wait $pid_2
$ echo $?
0
答案2
如何将 PID 和输出状态写入临时文件,例如通过“mktemp”。完成测试并检查其状态后,只需删除临时文件并在下次测试运行时创建一个新文件。或者保留所有临时文件以供以后参考,并检查临时文件的时间戳以获取与当前正在运行的测试相关的文件。