повторять команду bash бесконечно, но только после завершения предыдущей команды bash - PullRequest
0 голосов
/ 18 мая 2018

На нашей виртуальной машине 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 голосов
/ 19 мая 2018

Можете ли вы попытаться выяснить, работает ли ниже ваше дело.

#!/bin/bash

while true; do
  pid=0
  sudo ntpdate -u de.pool.ntp.org >> ntpdate.txt & pid=(${!})
  wait $pid
done
0 голосов
/ 23 мая 2018

Спасибо за все предложения.Как упоминал Чарльз Даффи, мой код уже работает только после завершения предыдущей команды.Я проверил это с помощью:

#!/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

Так что, по-видимому, таймер сна был слишком низким, чтобы реагировать на ограничение скорости.Возможно, мне придется увеличить время сна.

Как Чепнер предложил, я создал 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>

Чарльз Даффи, если вы сделаете ответ из своего комментария "Вашкод уже продолжается только после завершения предыдущей команды. "Я отмечу это как принятый ответ.

0 голосов
/ 18 мая 2018

Простой способ реализовать взаимное исключение в Bash - это использовать «файл блокировки».Вы проверяете, существует ли файл, и если он существует, вы не выполняете запрос NTP.Если файл не существует, вы создаете его.Полезным усовершенствованием в случае сбоя будет проверка, если время файла превышает несколько минут, и в этом случае его можно удалить.

...