У меня был сервер Ubuntu 16.04, который не мог загрузить TTY7, но TTY1 -6 работал. Если systemctl start
работает, вы можете использовать enable.
sudo systemctl enable getty@tty1
Демон 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
в каталоге проекта.