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

在Linux中直接从命令行运行可执行文件和从cron作业运行可执行文件之间有什么区别?,linux,language-agnostic,cron,Linux,Language Agnostic,Cron,我有一个可执行文件,它向远程服务器查询命令,在本地机器上执行命令,并将stdout(也可能是stderr)返回给服务器 如果从命令行(以root用户身份)调用此可执行文件,它运行得很好,但是我发现当cron作业自动执行某些命令时,它会失败 在使用crontab定期运行这个可执行文件时,在环境(用户、stdin、stdout等)方面有什么区别 谢谢 最重要的区别是.bashrc等文件不是在cron作业之前执行的,因此命令行中通常包含的许多环境变量将丢失。因此,如果您的程序在cron作业中无法工作,

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

如果从命令行(以root用户身份)调用此可执行文件,它运行得很好,但是我发现当cron作业自动执行某些命令时,它会失败

在使用crontab定期运行这个可执行文件时,在环境(用户、stdin、stdout等)方面有什么区别


谢谢

最重要的区别是.bashrc等文件不是在cron作业之前执行的,因此命令行中通常包含的许多环境变量将丢失。因此,如果您的程序在cron作业中无法工作,请将其嵌入到设置所有必要环境变量的脚本中

关于输入和输出,cron作业显然没有用户交互,因此程序不应该期望输入(如果期望输入,则从输入文件或直接在脚本中提供),任何输出都应该重定向到日志文件

如果从命令行(以root用户身份)调用此可执行文件,它运行得很好,但是我发现当cron作业自动执行某些命令时,它会失败

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

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

我指定每天运行“do_work.php”作为www数据。。。该文件将位于/etc/cron.d/

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

  • 当前工作目录-您无法从cron保证这将是什么。它可能是$HOME,但不要指望它
  • 环境变量-大多数为普通登录设置的变量都不会被设置,因此要求环境变量具有特定值的操作可能会失败。这主要包括$PATH
  • stdin/stdout/stderr将不是tty,因此某些程序的行为将因此而不同(stdout和err可能是临时文件;stdin可能为null)
但本质上你不能依赖太多

  • 用户ID、组ID和补充组应按照cron作业所有者的正常登录设置

另外一点提示:Java程序有时使用AWT函数,即使它们根本没有gui。特别是当他们操作图像时,但在计算列宽时,也可以使用HSSF。在cron作业中,此类程序必须以-Djava.awt.headless=true启动,否则会中断,因为cron中没有可用的X。在XTerm的命令行中,您根本没有注意到。。。