从 cron 执行 sh 脚本

从 cron 执行 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

我做错了什么?谢谢

答案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 中输入的命令不起作用时,有四个常见原因(按常见原因排列):

  1. Cron 提供了一个有限的环境,例如,最小的$PATH,并且缺少其他预期变量。
  2. Cron 默认调用 /bin/sh,而您可能会交互地使用其他 shell。
  3. Cron 特别对待 % 字符(它在命令中变成换行符)。
  4. Cron 不提供终端或图形环境。

如果您的作业产生任何输出,包括错误消息,cron 会向您发送一封包含整个输出的电子邮件。请确保您阅读了本地收到的邮件或将其转发到您阅读的地址。要将邮件从本地帐户转发到其他地址,请将其他地址输入~/.forward。如果 cron 作业以系统用户身份运行(rootwebmaster、 …),请确保该用户的邮件被重定向到您(以及任何其他管理员);对于大多数邮件设置,请输入类似的root: elzo/etc/aliases

答案3

cron 守护进程通常在 shell 中执行命令,其中 PATH 环境变量被限制为某些系统默认值,例如 /usr/bin:/bin。

可能您的php命令在 /usr/bin 或 /bin 中不可用,因此脚本在通过 cron 执行时会失败,而在不执行时会成功运行。

Cron 通常在作业完成后通过邮件向 root 用户报告错误或作业消息(即,当命令返回退出状态 != 0 或向 stdout/stderr 生成输出时)。

根据您的系统,您必须设置本地邮件传递才能获取这些消息。

相关内容