Как мне проверить код выхода команды, выполняемой flock?

StackOverflow https://stackoverflow.com/questions/1964301

Вопрос

Приветствую всех.Я настраиваю задание 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top