I.- Предисловие
У меня есть скрипт, который при запуске выполняет следующую строку кода:
exec("echo 'cd /usr/share/nginx/myproject && /opt/rh/rh-php70/root/usr/bin/php artisan run:task mailer' | /usr/bin/at now +1 minute");
Он успешно планирует задачу через at
команда.Я использую следующую команду, чтобы убедиться, что она работает:
[root@acool2 ~]#
[root@acool2 ~]# atq
19 Thu Apr 4 13:17:00 2019 a nginx
[root@acool2 ~]#
Слева направо видно следующее: номер задания , дата , час , год , очередь и имя пользователя .
II.- Проблема
Когда запланированное время выполнено, команда запускается, но не работает.Следующая информация записана в / var / spool / mail / nginx:
[root@acool2 ~]# tail -f /var/spool/mail/nginx
Received: by acool2.localdomain (Postfix, from userid 993)
id 0E9CF30EBA39; Thu, 4 Apr 2019 13:17:01 -0700 (PDT)
Subject: Output from your job 19
To: nginx@acool2.localdomain
Message-Id: <20190404201701.0E9CF30EBA39@acool2.localdomain>
Date: Thu, 4 Apr 2019 13:17:00 -0700 (PDT)
From: nginx@acool2.localdomain (Nginx web server)
This account is currently not available
Это явно проблема с разрешениями.См. Окончательное решение .
III.- Возможное решение
Отредактируйте файл sudoers и добавьте следующее:
nginx ALL=(acool) NOPASSWD: /usr/bin/at
Затем используйте следующую команду в PHP:
exec("sudo -u acool echo 'cd /usr/share/nginx/myproject && /opt/rh/rh-php70/root/usr/bin/php artisan run:task mailer' | /usr/bin/at now +1 minute");
См. Окончательное решение .
IV.- Сбой
После редактирования файла sudoer и корректировки кода PHP у меня все равно нет успеха. Проблема все еще происходит.
V.- HELP
Ваша помощь и предложения будут оценены.Спасибо за ваше время.
ОБНОВЛЕНИЕ I
Некоторый прогресс в отчете.Следующее запланировало задачу для acool , но ...
exec("echo 'cd /usr/share/nginx/myproject && /opt/rh/rh-php70/root/usr/bin/php artisan run:task mailer' | sudo -u acool /usr/bin/at now +1 minute")
[acool@acool2 myproject]$ atq
43 Thu Apr 4 15:02:00 2019 a acool
[acool@acool2 myproject]$
... Проблема теперь с acool / var/ spool / mail / acool:
[acool@acool2 ~]$ tail -f /var/spool/mail/acool
Received: by acool2.localdomain (Postfix, from userid 1001)
id 756B830EBA39; Thu, 4 Apr 2019 14:56:00 -0700 (PDT)
Subject: Output from your job 42
To: acool@acool2.localdomain
Message-Id: <20190404215600.756B830EBA39@acool2.localdomain>
Date: Thu, 4 Apr 2019 14:56:00 -0700 (PDT)
From: acool@acool2.localdomain
This account is currently not available.
ОБНОВЛЕНИЕ II
Получил работу с предложением Barmar, добавив флаг -E
к sudo
и следующееизменить на файл sudoers:
nginx ALL=(acool) NOPASSWD: ALL
Что слишком либерально для ИМО.
ОБНОВЛЕНИЕ III - Окончательное решение!
Проблема является результатом отсутствия / отсутствия переменной среды SHELL
.Нет необходимости редактировать файл sudoers или использовать sudo
.Добавление export SHELL=\"/bin/bash\";
к исходной команде делает свое дело.Вот рабочее решение:
exec("export SHELL=\"/bin/bash\"; echo 'cd /usr/share/nginx/myproject && /opt/rh/rh-php70/root/usr/bin/php artisan run:task mailer' | /usr/bin/at now +1 minute");
Удачи!Ура:)