Как мне проверить код выхода команды, выполняемой flock?
-
21-09-2019 - |
Вопрос
Приветствую всех.Я настраиваю задание cron для выполнения сценария bash, и я беспокоюсь, что следующее может начаться до завершения предыдущего.Небольшой поиск в Google показывает, что популярным способом решения этой проблемы является flock
команда, используемая следующим образом:
flock -n lockfile myscript.sh
if [ $? -eq 1 ]; then
echo "Previous script is still running! Can't execute!"
fi
Это отлично работает.Однако, что мне делать, если я хочу проверить код выхода из myscript.sh
?Какой бы код выхода он ни вернул, он будет перезаписан flock
's, так что у меня нет способа узнать, успешно ли это выполнено или нет.
Решение
Похоже, вы можете использовать альтернативную форму flock
, flock <fd>
, где <fd>
является файловым дескриптором.Если вы поместите это в подоболочку и перенаправите этот файловый дескриптор в свой файл блокировки, то flock будет ждать, пока не сможет выполнить запись в этот файл (или выдаст ошибку, если не сможет открыть его немедленно, а вы передали -n
).Затем вы можете делать все в своей подоболочке, включая тестирование возвращаемого значения запускаемых вами скриптов:
(
if flock -n 200
then
myscript.sh
echo $?
fi
) 200>lockfile
Другие советы
#!/bin/bash
if ! pgrep myscript.sh; then
flock -n lockfile myscript.sh
fi
Если я вас правильно понимаю, вы хотите убедиться, что 'myscript.sh' не выполняется до того, как cron попытается снова выполнить вашу команду.Предполагая, что это верно, мы проверяем, не удалось ли pgrep найти myscript.sh в списке процессов, и если да, то мы снова запускаем команду flock.
Возможно, что-то подобное сработало бы для вас.
#!/bin/bash
RETVAL=0
lockfailed()
{
echo "cannot flock"
exit 1
}
(
flock -w 2 42 || lockfailed
false
RETVAL=$?
echo "original retval $RETVAL"
exit $RETVAL
) 42>|/tmp/flocker
RETVAL=$?
echo "returned $RETVAL"
exit $RETVAL