Команда flock в root cron не выполняется

Команда flock в root cron не выполняется

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скрипт, используя flockroot 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в каталоге проекта.

Связанный контент