команда flock в корневом cron не выполняется

У меня был сервер Ubuntu 16.04, который не мог загрузить TTY7, но TTY1 -6 работал. Если systemctl startработает, вы можете использовать enable.

sudo systemctl enable getty@tty1

0
13.08.2020, 01:02
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в каталоге проекта.

5
18.03.2021, 23:13

Теги

Похожие вопросы