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: [email protected]
Message-Id: <[email protected]>
Date: Thu, 4 Apr 2019 13:17:00 -0700 (PDT)
From: [email protected] (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.-帮助
您的帮助和建议将不胜感激。谢谢你的时间。
更新我
一些进展报告。以下安排了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: [email protected]
Message-Id: <[email protected]>
Date: Thu, 4 Apr 2019 14:56:00 -0700 (PDT)
From: [email protected]
This account is currently not available.
更新II
得到它与Barmar建议一起使用,将-E
标志添加到sudo
并将以下更改添加到sudoers文件:
nginx ALL=(acool) NOPASSWD: ALL
这是过于自由的IMO。
更新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");
祝好运!干杯:)
你正在用echo
运行sudo
命令,它正在用普通的at
命令管道。您需要使用at
运行sudo
命令。
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")