无限重复bash命令,但仅在前一个bash命令完成时

时间:2018-05-18 09:04:29

标签: bash ntp

在我们用于构建的macOs虚拟机上,时间有时会毫无理由地跳出来。作为一种解决方法,我创建了名为test.sh的脚本,该脚本始终纠正时间:

#!/bin/bash -e

while true; do
    sudo ntpdate -u de.pool.ntp.org >> ntpdate.txt; sleep 30;
done

在构建开始时,这将在后台开始:

./test.sh &

构建完成后我就把它杀死了:

kill $(ps aux | grep test.sh | grep -v grep | awk '{print $2}')

有时更新时间的调用时间超过30秒。然后有两个对ntp池的打开调用,我得到了速率限制响应。因此,我想将对ntp的调用限制为一次只有一个。我如何在真正的循环中实现这一目标?

3 个答案:

答案 0 :(得分:1)

在Bash中实现互斥的一种简单方法是使用"锁定文件。"您检查文件是否存在,如果存在,则不执行NTP查询。如果该文件不存在,则创建该文件。在发生崩溃的情况下,一个有用的增强功能是检查文件时间是否超过几分钟,在这种情况下可以将其删除。

答案 1 :(得分:1)

您可以尝试查看以下内容是否符合您的情况。

#!/bin/bash

while true; do
  pid=0
  sudo ntpdate -u de.pool.ntp.org >> ntpdate.txt & pid=(${!})
  wait $pid
done

答案 2 :(得分:0)

感谢所有建议。正如Charles Duffy提到的那样,我的代码只有在上一个命令完成时才会继续。我用它测试了它:

#!/bin/bash -e

while true; do
    echo "start ntpdate"
    sudo ntpdate -u de.pool.ntp.org >> ntpdate.txt; 
    echo "going to sleep"
    sleep 30;
done

显然,睡眠定时器太低而无法进入速率限制响应。也许我必须提高睡眠时间。

正如chepner建议我创建了一个LaunchAgent来处理这个问题:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>workaroundAgainstJumpingTime</string>
    <key>ProgramArguments</key>
    <array>
        <string>sudo</string>
        <string>ntpdate</string>
        <string>-u</string>
        <string>de.pool.ntp.org</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/tmp/workaroundAgainstJumpingTime.stderr</string>
    <key>StandardOutPath</key>
    <string>/tmp/workaroundAgainstJumpingTime.stdout</string>
    <key>StartInterval</key>
    <integer>30</integer>
</dict>
</plist>

Charles Duffy,如果你从你的评论中做出回答&#34;你的代码只有在前一个命令完成时才会继续。&#34;我将其标记为已接受的答案。