У меня есть сценарий резервного копирования tar
, который запускается один раз в месяц. Он работает ночью через cron
. У меня также есть график мощности, который перезагружает сервер на 4.15 каждую ночь.
Проблема в том, что сервер перезагружается, пока запущен скрипт tar
.
Могу ли я добавить что-то к началу и концу сценария bash, чтобы отключить перезагрузку, в то время как сценарий активен?
Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:
http://mywiki.wooledge.org/BashFAQ/045
Вы можете реализовать что-то подобное, но создайте цикл перезагрузки, пока блокировка не станет бесплатной. Я не тестировал следующее, но вот отправная точка:
Tar script:
#!/bin/bash
lockdir=/tmp/myscript.lock
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
echo >&2 "successfully acquired lock: $lockdir"
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
# continue script
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
exit 0
fi
# DO YOUR ORIGINAL TAR SCRIPT HERE
Сценарий перезагрузки:
#!/bin/bash
lockdir=/tmp/myscript.lock
while true; do
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
break # continue with script
else
sleep 5 # sleep for 5 seconds and try again
fi
done
# RUN YOUR REBOOT COMMANDS HERE
Я бы использовал метод опроса для pid этого скрипта. Основная идея - ждать, пока скрипт не выпустит PID (это означает, что он вышел), и только затем перейдите к следующему шагу сценария перезагрузки. И, конечно, если процесс не запущен, скрипт будет перезагружен.
#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do
sleep 0.25 # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:
http://mywiki.wooledge.org/BashFAQ/045
Вы можете реализовать что-то подобное, но создайте цикл перезагрузки, пока блокировка не станет бесплатной. Я не тестировал следующее, но вот отправная точка:
Tar script:
#!/bin/bash
lockdir=/tmp/myscript.lock
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
echo >&2 "successfully acquired lock: $lockdir"
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
# continue script
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
exit 0
fi
# DO YOUR ORIGINAL TAR SCRIPT HERE
Сценарий перезагрузки:
#!/bin/bash
lockdir=/tmp/myscript.lock
while true; do
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
break # continue with script
else
sleep 5 # sleep for 5 seconds and try again
fi
done
# RUN YOUR REBOOT COMMANDS HERE
Я бы использовал метод опроса для pid этого скрипта. Основная идея - ждать, пока скрипт не выпустит PID (это означает, что он вышел), и только затем перейдите к следующему шагу сценария перезагрузки. И, конечно, если процесс не запущен, скрипт будет перезагружен.
#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do
sleep 0.25 # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:
http://mywiki.wooledge.org/BashFAQ/045
Вы можете реализовать что-то подобное, но создайте цикл перезагрузки, пока блокировка не станет бесплатной. Я не тестировал следующее, но вот отправная точка:
Tar script:
#!/bin/bash
lockdir=/tmp/myscript.lock
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
echo >&2 "successfully acquired lock: $lockdir"
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
# continue script
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
exit 0
fi
# DO YOUR ORIGINAL TAR SCRIPT HERE
Сценарий перезагрузки:
#!/bin/bash
lockdir=/tmp/myscript.lock
while true; do
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
break # continue with script
else
sleep 5 # sleep for 5 seconds and try again
fi
done
# RUN YOUR REBOOT COMMANDS HERE
Я бы использовал метод опроса для pid этого скрипта. Основная идея - ждать, пока скрипт не выпустит PID (это означает, что он вышел), и только затем перейдите к следующему шагу сценария перезагрузки. И, конечно, если процесс не запущен, скрипт будет перезагружен.
#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do
sleep 0.25 # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:
http://mywiki.wooledge.org/BashFAQ/045
Вы можете реализовать что-то подобное, но создайте цикл перезагрузки, пока блокировка не станет бесплатной. Я не тестировал следующее, но вот отправная точка:
Tar script:
#!/bin/bash
lockdir=/tmp/myscript.lock
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
echo >&2 "successfully acquired lock: $lockdir"
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
# continue script
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
exit 0
fi
# DO YOUR ORIGINAL TAR SCRIPT HERE
Сценарий перезагрузки:
#!/bin/bash
lockdir=/tmp/myscript.lock
while true; do
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
break # continue with script
else
sleep 5 # sleep for 5 seconds and try again
fi
done
# RUN YOUR REBOOT COMMANDS HERE
Я бы использовал метод опроса для pid этого скрипта. Основная идея - ждать, пока скрипт не выпустит PID (это означает, что он вышел), и только затем перейдите к следующему шагу сценария перезагрузки. И, конечно, если процесс не запущен, скрипт будет перезагружен.
#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do
sleep 0.25 # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:
http://mywiki.wooledge.org/BashFAQ/045
Вы можете реализовать что-то подобное, но создайте цикл перезагрузки, пока блокировка не станет бесплатной. Я не тестировал следующее, но вот отправная точка:
Tar script:
#!/bin/bash
lockdir=/tmp/myscript.lock
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
echo >&2 "successfully acquired lock: $lockdir"
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
# continue script
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
exit 0
fi
# DO YOUR ORIGINAL TAR SCRIPT HERE
Сценарий перезагрузки:
#!/bin/bash
lockdir=/tmp/myscript.lock
while true; do
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
break # continue with script
else
sleep 5 # sleep for 5 seconds and try again
fi
done
# RUN YOUR REBOOT COMMANDS HERE
Я бы использовал метод опроса для pid этого скрипта. Основная идея - ждать, пока скрипт не выпустит PID (это означает, что он вышел), и только затем перейдите к следующему шагу сценария перезагрузки. И, конечно, если процесс не запущен, скрипт будет перезагружен.
#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do
sleep 0.25 # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:
http://mywiki.wooledge.org/BashFAQ/045
Вы можете реализовать что-то подобное, но создайте цикл перезагрузки, пока блокировка не станет бесплатной. Я не тестировал следующее, но вот отправная точка:
Tar script:
#!/bin/bash
lockdir=/tmp/myscript.lock
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
echo >&2 "successfully acquired lock: $lockdir"
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
# continue script
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
exit 0
fi
# DO YOUR ORIGINAL TAR SCRIPT HERE
Сценарий перезагрузки:
#!/bin/bash
lockdir=/tmp/myscript.lock
while true; do
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
break # continue with script
else
sleep 5 # sleep for 5 seconds and try again
fi
done
# RUN YOUR REBOOT COMMANDS HERE
Я бы использовал метод опроса для pid этого скрипта. Основная идея - ждать, пока скрипт не выпустит PID (это означает, что он вышел), и только затем перейдите к следующему шагу сценария перезагрузки. И, конечно, если процесс не запущен, скрипт будет перезагружен.
#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do
sleep 0.25 # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:
http://mywiki.wooledge.org/BashFAQ/045
Вы можете реализовать что-то подобное, но создайте цикл перезагрузки, пока блокировка не станет бесплатной. Я не тестировал следующее, но вот отправная точка:
Tar script:
#!/bin/bash
lockdir=/tmp/myscript.lock
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
echo >&2 "successfully acquired lock: $lockdir"
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
# continue script
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
exit 0
fi
# DO YOUR ORIGINAL TAR SCRIPT HERE
Сценарий перезагрузки:
#!/bin/bash
lockdir=/tmp/myscript.lock
while true; do
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
trap 'rm -rf "$lockdir"' 0 # remove directory when script finishes
break # continue with script
else
sleep 5 # sleep for 5 seconds and try again
fi
done
# RUN YOUR REBOOT COMMANDS HERE