繁体   English   中英

直接从命令行运行可执行文件和在Linux中运行cron作业有什么区别?

[英]What are the differences between running an executable straight from the command line and from a cron job in Linux?

我有这个可执行文件,它在远程服务器上查询命令,在本地机器上执行它,并将stdout(也可能是stderr)从它返回给服务器。

如果从命令行调用(作为root),这个可执行文件运行得很好,但是我发现当cron作业自动执行时某些命令失败了。

在安排使用crontab定期运行此可执行文件时,我应该期待在环境(用户,标准输入,标准输出等)方面有什么不同?

谢谢!

最重要的区别是.bashrc之类的文件在cron作业之前没有执行,所以你在命令行中通常拥有的很多环境变量都会丢失。 因此,如果您的程序在cron作业中不起作用,请将其嵌入到设置所有必要环境变量的脚本中。

关于输入和输出,显然没有用户交互的cron作业,所以程序不应该期望输入(如果它们这样做,从输入文件或直接在脚本中提供),并且任何输出都应该重定向到日志文件中。

如果从命令行调用(作为root),这个可执行文件运行得很好,但是我发现当cron作业自动执行时某些命令失败了。

在cron作业中,您可以指定运行脚本的用户,例如:

0 0 * * * www-data /usr/bin/php /var/www/foo/do_work.php

我指定每天运行'do_work.php'作为www-data ...这个文件将位于/etc/cron.d/

此外,您应该检查cron用于运行任务的UID,特别是如果它是“全局”/ etc / crontab作业,而不是用户级作业。 如果作业从'nobody'或'cron'运行,可能会缺少某些权限。

主要

  • 当前的工作目录 - 你不能保证这将来自cron。 它可能是$ HOME,但不要指望它
  • 环境变量 - 您为正常登录设置的大多数都不会被设置,因此需要环境变量具有特定值的事情可能会失败。 这显然包括$ PATH。
  • stdin / stdout / stderr不会是tty,所以有些程序会因此而表现不同(stdout和err可能是临时文件; stdin可能为null)

但基本上你不能依赖太多

  • 应根据cron作业所有者的正常登录设置用户ID,组ID和补充组

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM