我有一个 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
我做错了什么?谢谢
答案1
据该男子称:
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”的完整路径。
...
答案2
在终端中输入但从 cron 中输入的命令不起作用时,有四个常见原因(按常见原因排列):
- Cron 提供了一个有限的环境,例如,最小的
$PATH
,并且缺少其他预期变量。 - Cron 默认调用 /bin/sh,而您可能会交互地使用其他 shell。
- Cron 特别对待 % 字符(它在命令中变成换行符)。
- Cron 不提供终端或图形环境。
如果您的作业产生任何输出,包括错误消息,cron 会向您发送一封包含整个输出的电子邮件。请确保您阅读了本地收到的邮件或将其转发到您阅读的地址。要将邮件从本地帐户转发到其他地址,请将其他地址输入~/.forward
。如果 cron 作业以系统用户身份运行(root
、webmaster
、 …),请确保该用户的邮件被重定向到您(以及任何其他管理员);对于大多数邮件设置,请输入类似的root: elzo
行/etc/aliases
。
答案3
cron 守护进程通常在 shell 中执行命令,其中 PATH 环境变量被限制为某些系统默认值,例如 /usr/bin:/bin。
可能您的php
命令在 /usr/bin 或 /bin 中不可用,因此脚本在通过 cron 执行时会失败,而在不执行时会成功运行。
Cron 通常在作业完成后通过邮件向 root 用户报告错误或作业消息(即,当命令返回退出状态 != 0 或向 stdout/stderr 生成输出时)。
根据您的系统,您必须设置本地邮件传递才能获取这些消息。