从cron执行sh脚本


12

我有一个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

我做错了什么?谢谢


“不起作用”不起作用。看到?你不知道我的意思,就像我们也不知道你的意思。我的意思是(是)什么不起作用?可能是任何事情。可能是tmow的猜测是正确的,但这只是一个猜测(我认为是相当不错的猜测,但仍然如此)。
于尔根A.艾哈德

是的,如果您可以更具体地了解所看到的结果,我们将能够更好地确定问题所在。也就是说,你是什么意思“不工作”(:
。加布

我在syslog中看不到任何日志,并且脚本正在向数据库中插入一些未发生的插入,如果我手动运行脚本,则会发生这些插入。
Elzo Valugi 2011年

Answers:


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

例如,另一种方法是获取/ 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”。
...


错误的$ PATH是手动执行脚本的最常见原因,但并非来自cron。
Patrick

@Patrick如果cron不知道php在哪里,那当然是个问题,否则Elzo crontab可以正常工作而没有任何问题,这一定是PATH问题。
tmow 2011年

非常感谢您的回答。它非常容易为我工作!!!非常感谢@tmow。
Vignesh Prajapati

5

在终端中键入命令而不是从cron键入命令时,存在四种常见原因,原因是常见:

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

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


2

cron守护程序通常在将PATH环境变量限制为某些系统默认值的外壳程序中执行命令,例如/ usr / bin:/ bin。

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.