我试图找出是否有一个命令允许调用另一个脚本并按 FIFO 顺序处理这些调用。
例如:脚本 A 无限循环运行。在此循环中,连续发出 10 次请求来执行脚本 B。 然而,脚本 B 只能在其前一个请求结束后执行。在 10 个请求的脚本 B 连续执行期间,脚本 A 必须继续工作。
答案1
shell 的内置命令wait
正是为解决这个目的而设计的,等待某个进程(或多个进程)完成并收集它的退出状态。
你可以:
script_A
无限循环运行,或者exit
如果它产生并完成执行 10 个实例script_B
使用
script_A
循环结构,在循环中,将发送script_B
到后台,使用获取其 PID$!
等待过程完成
wait PID
重复 10 次
退出
script_A
,或继续其他操作
因此你可以script_A
这样做:
#!/bin/bash
for ((i=1; i<=10; i++)); do
echo "Run $i :: script_B"
/path/to/script_B &
pid=$!
wait "$pid"
done
如果您想继续做其他事情,请将它们附加到for
构造之后。
仅出于完整性考虑,如果您想根据上一次的退出状态继续/退出scrip_B
,请也添加一个对退出状态的简短检查:
#!/bin/bash
for ((i=1; i<=10; i++)); do
echo "Run $i :: script_B"
/path/to/script_B &
pid=$!
wait "$pid" && continue
break
done
答案2
我在脚本中使用状态文件来防止它被执行两次,但您可以轻松地调整同一系统以允许脚本以 FIFO 模式执行:
例如在下面的例子中,如果脚本已经在运行,它就会退出:
#!/bin/bash
if [ -f /var/tmp/backup.bsy ]; then
# backup already running, log and exit
exit;
fi
# Set backup status to "Busy"
mv /var/tmp/backup.ok /var/tmp/backup.bsy
# perform backup here
# Set backup status to "Done"
mv /var/tmp/backup.bsy /var/tmp/backup.ok
并且将其更改exit
为一个循环很简单,该循环需要几秒sleep
/几分钟(取决于您的使用要求)并查看script.1
,,,,...是否存在并按正确的顺序执行它们......script.2
script.3
script.4
;-)
答案3
也许我误解了,但你不能只把scriptB
命令组(或子 shell)中的调用放在后台吗?那所以这样团体异步执行,例如
#!/bin/bash
echo "Submiting B command group at: $(date)"
{
./scriptB
./scriptB
./scriptB
./scriptB
./scriptB
./scriptB
./scriptB
./scriptB
./scriptB
./scriptB
} &
echo "Continuing to work at: $(date)"
exit
为了便于说明,这里scriptB
只是
#!/bin/bash
echo "Starting B at: $(date)"
sleep $((RANDOM/8192))
然后
$ ./scriptA
Submiting B command group at: Mon Oct 17 19:50:07 EDT 2016
Continuing to work at: Mon Oct 17 19:50:07 EDT 2016
user@host$ Starting B at: Mon Oct 17 19:50:07 EDT 2016
Starting B at: Mon Oct 17 19:50:10 EDT 2016
Starting B at: Mon Oct 17 19:50:11 EDT 2016
Starting B at: Mon Oct 17 19:50:12 EDT 2016
Starting B at: Mon Oct 17 19:50:13 EDT 2016
Starting B at: Mon Oct 17 19:50:15 EDT 2016
Starting B at: Mon Oct 17 19:50:15 EDT 2016
Starting B at: Mon Oct 17 19:50:18 EDT 2016
Starting B at: Mon Oct 17 19:50:18 EDT 2016
Starting B at: Mon Oct 17 19:50:18 EDT 2016