2009-12-26 3 views
3

Приветствую всех. Я настраиваю задание cron для выполнения сценария bash, и я беспокоюсь, что следующий может начаться до окончания предыдущего. Немного прибегая к помощи показывает, что популярный способ решения этой проблемы является flock командой, используются следующим образом:Как проверить код выхода команды, выполняемой стаей?

flock -n lockfile myscript.sh 
if [ $? -eq 1 ]; then 
    echo "Previous script is still running! Can't execute!" 
fi 

Это прекрасно работает. Однако, что мне делать, если я хочу проверить код выхода myscript.sh? Независимо от того, какой код выхода, который он возвращает, будет перезаписан flock, так что у меня нет способа узнать, успешно ли он выполнен или нет.

ответ

6

Похоже, вы можете использовать альтернативную форму flock, flock <fd>, где <fd> - это файловый дескриптор. Если вы поместите это в подоболочку и перенаправьте дескриптор файла в файл блокировки, тогда стая будет ждать, пока она не сможет записать этот файл (или если ошибка не открывается, и вы прошли -n). Вы можете сделать все, что в вашем субоболочке, включая тестирование возвращаемого значения скриптов вы бежите:

(
    if flock -n 200 
    then 
    myscript.sh 
    echo $? 
    fi 
) 200>lockfile 
+0

Или, если OP необходимо использовать '$?' Позже, избавиться от подоболочки и явно открыть/закрыть, например, 'exec 200> lockfile; если ... fi; exec 200> & - '. – ephemient

+0

Это прекрасно работает. Большое спасибо Брайан. –

0
#!/bin/bash 

if ! pgrep myscript.sh; then 
    flock -n lockfile myscript.sh 
fi 

Если я правильно Вас понял, вы хотите, чтобы убедиться, что «myscript.sh» не работает, прежде чем попытки хрон снова запустить команду. Предполагая, что это правильно, мы проверяем, не удалось ли pgrep найти myscript.sh в списке процессов, и если это так, мы снова запустим команду flock.

0

Возможно, что-то подобное будет работать для вас.

#!/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