从 cron 执行 sh 脚本

Elz*_*ugi 12 shell cron

我有一个 test.sh 脚本

#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh
Run Code Online (Sandbox Code Playgroud)

当我从命令行以 root 身份执行文件时,它可以工作。

sh /home/v/test.sh 
Run Code Online (Sandbox Code Playgroud)

当我将它设置为 crontab -e(是根 cron)时,它不起作用

 * * * * * sh /home/v/test.sh
Run Code Online (Sandbox Code Playgroud)

我做错了什么?谢谢

tmo*_*mow 15

据该男子介绍:

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
Run Code Online (Sandbox Code Playgroud)

另一种方法是获取/etc/profile(或你的.profile/.bashrc),例如

* * * * * . /home/v/.bashrc ; sh /home/v/test.sh
Run Code Online (Sandbox Code Playgroud)

如果您的 .bashrc 设置了您需要的环境变量(即 PATH),这将很有用

编辑

一个有趣的阅读是“新手:cron 简介”,不要从标题上低估这篇文章(这是一个适合所有人的阅读),实际上它写得很好,完整地回答了你的问题:

...
PATH 包含将在 cron 的搜索路径中的目录,例如,如果您在 /usr/cog/bin 目录中有一个程序 'foo',则可能值得将 /usr/cog/bin 添加到路径,因为它会阻止您每次要调用它时都必须使用“foo”的完整路径。
...


Gil*_*il' 5

在终端中键入命令而不是从 cron 中键入命令时,有四种常见原因,按常见顺序排列:

  1. Cron 提供了一个有限的环境,例如,一个 minimum$PATH和其他预期变量缺失。
  2. 默认情况下,Cron 调用 /bin/sh,而您可能正在以交互方式使用其他一些 shell。
  3. Cron 特别对待 % 字符(它在命令中变成了换行符)。
  4. Cron 不提供终端或图形环境。

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