我有一个test.sh脚本
#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh
当我从命令行以root用户身份执行文件时,它可以工作。
sh /home/v/test.sh
当我将其设置为crontab -e(是根cron)时,无法正常工作
* * * * * sh /home/v/test.sh
我做错了什么?谢谢
我有一个test.sh脚本
#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh
当我从命令行以root用户身份执行文件时,它可以工作。
sh /home/v/test.sh
当我将其设置为crontab -e(是根cron)时,无法正常工作
* * * * * sh /home/v/test.sh
我做错了什么?谢谢
Answers:
据该男子说:
cron守护程序从您的HOME目录启动一个子Shell。如果您计划在未登录时运行命令,并且希望运行.profile文件中的命令,则该命令必须显式读取.profile文件。
cron守护程序为每个shell提供了默认环境,定义了HOME,LOGNAME,SHELL(= / usr / bin / sh)
和PATH(= / usr / bin)。
因此,cron守护程序不知道php在哪里,您应该手动指定完整的php路径,例如(我不知道您的真实PHP路径):
#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh
例如,另一种方法是获取/ etc / profile(或您的.profile / .bashrc)的资源
* * * * * . /home/v/.bashrc ; sh /home/v/test.sh
如果您的.bashrc设置了所需的环境变量(即PATH),这将很有用
编辑
一个有趣的读物是“ 新手:cron简介 ”,不要低估标题中的文章(这是每个人的阅读物),事实上,它写得很完整,可以完美地回答您的问题:
...
PATH包含将在cron搜索路径中的目录,例如,如果您在/ usr / cog / bin目录中有一个程序'foo',则可能值得将/ usr / cog / bin添加到路径,因为它将阻止您每次要调用它时都必须使用完整路径“ foo”。
...
在终端中键入命令而不是从cron键入命令时,存在四种常见原因,原因是常见:
$PATH
和其他预期变量缺失。如果您的工作产生任何输出,包括错误消息,则cron向您发送一封包含整个输出的电子邮件。确保您阅读了在本地收到的邮件,或者将其转发到您阅读的地址。要将邮件从本地帐户转发到其他地址,请在中输入其他地址~/.forward
。如果cron作业以系统用户(root
,,webmaster
…)的身份运行,请确保将用户的邮件重定向到您(和其他管理员);与大多数的邮件设置,放线,如root: elzo
在/etc/aliases
。
cron守护程序通常在将PATH环境变量限制为某些系统默认值的外壳程序中执行命令,例如/ usr / bin:/ bin。
可能您的php
命令在/ usr / bin或/ bin中不可用,因此该脚本在通过cron执行时失败,而在没有通过cron执行时成功运行。
作业完成后,Cron通常会通过邮件将错误或作业消息报告给root用户(即,当命令返回退出状态!= 0或将输出生成到stdout / stderr时)。
根据您的系统,您必须设置本地邮件传递才能获取这些消息。