Решенный вопрос. Если Вы зарегистрированы с учетной записью, которая имеет права "Администратора" на удаленном сервере, просто сделайте:
sc \\remote-server stop service-name
и
sc \\remote-server start service-name
sc
управляйте работает асинхронно к диспетчеру управления службами, таким образом, можно хотеть запросить сервис с командой ниже, чтобы обеспечить, чтобы это на самом деле остановилось, прежде чем Вы попытаетесь запустить его снова:
sc \\remote-server query service-name
Я бы, вероятно, записал на центральный сервер файл завершения, который включает дату и имя хоста; вы можете использовать это:
#!/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
Для атаки на более общий случай, который: « Как лучше всего запланировать выполнение команды, гарантируя, что предыдущий набор команд завершен? »
вам нужно запустить команду и проверить ее успешность (код выхода), затем вы можете запланировать выполнение команды с помощью системного планировщика (обычно в ). Например:
#!/bin/bash
rsync "${opts[@]}" "$source" "$dest"
if [[ $? -eq 0 ]]; then
at now+10hours <<<"~jdoe/bin/rotatefolders.sh"
fi
Здесь я предположил, что ваш сценарий поворота папок был назван rotatefolders.sh в bin в домашней папке jdoe.
Поскольку вы используете rsync, я предполагаю, что вы делаете это через ssh-туннель. Если это так, то у вас также есть ssh.
Вместо цикла ожидания занятости лучше использовать сигнализацию, когда rsync-job завершится.
«Сигнал» может вызвать ротацию журнала в резервной копии Система .server - либо путем прямого запуска logrotate, либо путем его косвенного запуска (через sudo или ssh-key).
Вы можете использовать файл 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 не завершит работу, и наоборот.