
root
У меня в crontab на Debian есть следующий код
* * * * * flock -xn /absolute/path/to/run.lock -c cd /absolute/parth/to/project && ./run >> run.log
Но я не вижу ни run.log
одного run.lock
файла, где я их указываю. Фактически, нет никаких доказательств того, что скрипт был выполнен.
Запуск ps aux | grep run
дает только этот grep
колл.
Как запустить run
скрипт, используя flock
root crontab
?
решение1
Команда в строке crontab не обрабатывается так, как вы ожидаете.
Демон cron выполнит команду, используя оболочку, настроенную для соответствующего пользователя.
Эта первая оболочка увидит две команды, разделенные оператором &&
управления. Поэтому вторая команда выполняется только в том случае, если первая команда завершается с нулевым кодом возврата, что указывает на успех.
Первая команда: flock -xn /absolute/path/to/run.lock -c cd /absolute/path/to/project
.
Вторая команда: ./run >> run.log
.
Первая команда создаст файл блокировки и запустит команду cd
как дочерний процесс, т. е. в другом экземпляре оболочки. cd
Команда без аргументов перейдет в домашний каталог пользователя, после чего оболочка, запущенная с помощью, flock
немедленно завершит работу. Это будет равносильно отсутствию какого-либо эффекта.
Даже с указанным путем cd /absolute/path/to/project
команда не окажет никакого эффекта ни на рабочий каталог команды flock
, ни на вторую команду, выполненную первым экземпляром оболочки.Это связано с тем, что cd
команда влияет только на тот конкретный экземпляр оболочки, в котором она запущена, а не на его родительские экземпляры.
рассматривается /absolute/path/to/project
как дополнительное имя файла для flock
команды, а не как параметр для cd
.
Поскольку первая команда завершилась и не сообщила об ошибках, первый экземпляр оболочки (первоначально инициированный демоном cron
) теперь запустит вторую команду. Поскольку рабочий каталог этой оболочки не изменился, он по-прежнему является домашним каталогом пользователя root
, поэтому он в конечном итоге пытается выполнить то, что фактически /root/run >>/root/run.log
.
Я предполагаю, что вы, вероятно, имели в виду что-то вроде этого:
* * * * * flock -xn /absolute/path/to/run.lock -c "cd /absolute/path/to/project && ./run >> run.log"
Кавычки не позволят первой оболочке разбить командную строку на &&
, поэтому вторая оболочка (запущенная командой flock
) получит всю оставшуюся командную строку, и поэтому cd /absolute/path/to/project
команда будет осмысленно выполнена перед запуском ./run
в каталоге проекта.