Bash 脚本中的 FIFO 命令

Bash 脚本中的 FIFO 命令

我试图找出是否有一个命令允许调用另一个脚本并按 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.2script.3script.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

相关内容