如何在 bash 脚本中 运行 命令行工具的多个实例? + 脚本的用户输入
How to run multiple instances of command-line tool in bash script? + user input for script
我正在尝试从 Mac 上的单个 bash 脚本同时启动 imagesnap
的多个实例。此外,在 运行 脚本时通过用户输入给出(一些)参数会很棒。
我连接了 4 个网络摄像头,并希望以给定的间隔从每个摄像头拍摄一系列图像。作为 bash 脚本的绝对初学者,我不知道从哪里开始搜索。我已经测试了 4 个 imagesnap 实例在从终端手动 运行 时工作得很好,但仅此而已。
总而言之,我希望制作一个 bash 脚本:
- 运行 imagesnap 的多个实例。
- 有用户输入 imagesnap 的一些参数。
- 理想情况下(几乎)同时启动所有 imagesnap 实例。
--编辑--
考虑到这一点后,我对如何使用 imagesnap -t x.xx
拍摄间隔图像的能力来组织这个脚本有一个模糊的想法:
- 运行 主脚本中的多个脚本
或
使用子 shell 运行 imagesnap
的多个实例
如果可能,并行启动每个子脚本或子 shell。
由于 imagesnap
的每个实例都会 运行 直到终止,如果它们都可以用一个命令停止就太好了
以下快速破解(保存为 run-periodically.sh
)可能会做正确的事情:
#!/bin/bash
interval=5
start=$(date +%s)
while true; do
# run jobs in the background
for i in 1 2 3 4; do
"$@" &
done
# wait for all background jobs to finish
wait
# figure out how long we have to sleep
end=$(date +%s)
delta=$((start + interval - end))
# if it's positive sleep for this amount of time
if [ $delta -gt 0 ]; then
sleep $delta || exit
fi
start=$((start + interval))
done
如果您将此脚本放在适当的位置并使其可执行,您可以运行它像:
run-periodically.sh imagesnap arg1 arg2
但在测试时,我 运行 使用:
sh run-periodically.sh sh -c "date; sleep 2"
这将导致 "start a shell that displays the date then waits a couple of seconds" 的四个副本每 interval
秒并行 运行。如果你想 运行 在不同的工作中做不同的事情,那么你可能想将它们明确地放入这个脚本或者这个脚本调用的另一个脚本中......
我正在尝试从 Mac 上的单个 bash 脚本同时启动 imagesnap
的多个实例。此外,在 运行 脚本时通过用户输入给出(一些)参数会很棒。
我连接了 4 个网络摄像头,并希望以给定的间隔从每个摄像头拍摄一系列图像。作为 bash 脚本的绝对初学者,我不知道从哪里开始搜索。我已经测试了 4 个 imagesnap 实例在从终端手动 运行 时工作得很好,但仅此而已。
总而言之,我希望制作一个 bash 脚本:
- 运行 imagesnap 的多个实例。
- 有用户输入 imagesnap 的一些参数。
- 理想情况下(几乎)同时启动所有 imagesnap 实例。
--编辑--
考虑到这一点后,我对如何使用 imagesnap -t x.xx
拍摄间隔图像的能力来组织这个脚本有一个模糊的想法:
- 运行 主脚本中的多个脚本
或
使用子 shell 运行
imagesnap
的多个实例
如果可能,并行启动每个子脚本或子 shell。
由于
imagesnap
的每个实例都会 运行 直到终止,如果它们都可以用一个命令停止就太好了
以下快速破解(保存为 run-periodically.sh
)可能会做正确的事情:
#!/bin/bash
interval=5
start=$(date +%s)
while true; do
# run jobs in the background
for i in 1 2 3 4; do
"$@" &
done
# wait for all background jobs to finish
wait
# figure out how long we have to sleep
end=$(date +%s)
delta=$((start + interval - end))
# if it's positive sleep for this amount of time
if [ $delta -gt 0 ]; then
sleep $delta || exit
fi
start=$((start + interval))
done
如果您将此脚本放在适当的位置并使其可执行,您可以运行它像:
run-periodically.sh imagesnap arg1 arg2
但在测试时,我 运行 使用:
sh run-periodically.sh sh -c "date; sleep 2"
这将导致 "start a shell that displays the date then waits a couple of seconds" 的四个副本每 interval
秒并行 运行。如果你想 运行 在不同的工作中做不同的事情,那么你可能想将它们明确地放入这个脚本或者这个脚本调用的另一个脚本中......