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

StackOverflow https://stackoverflow.com/questions/1618238

  •  06-07-2019
  •  | 
  •  

我有这个可执行文件,它查询远程服务器的命令,在本地计算机上执行它,并将标准输出(也可能是标准错误)从它返回到服务器。

如果从命令行(作为 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 可能是临时文件;标准输入可能为空)

但本质上你不能依赖太多

  • 应按照 cron 作业所有者的正常登录设置用户 ID、组 ID 和补充组
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top