Что лучший способ состоит в том, чтобы запланировать команду для выполнения, гарантировав, что предыдущий набор команд завершился?

Решенный вопрос. Если Вы зарегистрированы с учетной записью, которая имеет права "Администратора" на удаленном сервере, просто сделайте:

sc \\remote-server stop service-name

и

sc \\remote-server start service-name

sc управляйте работает асинхронно к диспетчеру управления службами, таким образом, можно хотеть запросить сервис с командой ниже, чтобы обеспечить, чтобы это на самом деле остановилось, прежде чем Вы попытаетесь запустить его снова:

sc \\remote-server query service-name
2
задан 16 March 2012 в 19:44
4 ответа

Я бы, вероятно, записал на центральный сервер файл завершения, который включает дату и имя хоста; вы можете использовать это:

#!/bin/bash
# when each backup completes, write a completion file:
ssh user@central-server "touch /path/to/completion-files/$HOST-$(date +%F).complete"

А на центральном сервере:

#!/bin/bash
# on the central server, run this before attempting folder rotation
for h in (list of hosts); do
  if [[ -e "/path/to/completion-files/$h-$(date +%F)" ]]; 
    then # do your thing
  fi
done
5
ответ дан 3 December 2019 в 09:41

Для атаки на более общий случай, который: « Как лучше всего запланировать выполнение команды, гарантируя, что предыдущий набор команд завершен? »

вам нужно запустить команду и проверить ее успешность (код выхода), затем вы можете запланировать выполнение команды с помощью системного планировщика (обычно в ). Например:

 #!/bin/bash
 rsync "${opts[@]}" "$source" "$dest"
 if [[ $? -eq 0 ]]; then
   at now+10hours <<<"~jdoe/bin/rotatefolders.sh"
 fi

Здесь я предположил, что ваш сценарий поворота папок был назван rotatefolders.sh в bin в домашней папке jdoe.

1
ответ дан 3 December 2019 в 09:41

Поскольку вы используете rsync, я предполагаю, что вы делаете это через ssh-туннель. Если это так, то у вас также есть ssh.

Вместо цикла ожидания занятости лучше использовать сигнализацию, когда rsync-job завершится.

«Сигнал» может вызвать ротацию журнала в резервной копии Система .server - либо путем прямого запуска logrotate, либо путем его косвенного запуска (через sudo или ssh-key).

0
ответ дан 3 December 2019 в 09:41

Вы можете использовать файл pid:

PID_FILE="/path/to/pid.pid"   
    if [ -f $PID_FILE ]
    then
            OLD_PID=`cat $PID_FILE`
            RUNNING=`ps aux |grep $OLD_PID|grep -v grep|wc -l`
            if [ $RUNNING -gt 0 ]
            then
                    echo "WARNING PROGRAM already running"
                    exit 0
            else
                    echo "PID file exists but program is not running. Overriding PID file"
            fi
    fi
    echo $$ > $PID_FILE
    trap "rm -f $PID_FILE; exit" INT TERM EXIT

Совместно используя файл pid, вы убедитесь, что B не запустится, пока A не завершит работу, и наоборот.

-1
ответ дан 3 December 2019 в 09:41

Теги

Похожие вопросы