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

3
我有一个可执行文件,它查询远程服务器的命令,在本地机器上执行并将stdout(以及可能的stderr)返回给服务器。
如果在命令行(作为root用户)中调用这个可执行文件,它可以正常运行,但我发现当自动由cron job执行某些命令时,它会失败。
当使用crontab周期性地安排运行此可执行文件时,我应该期望环境方面(用户、stdin、stdout等)有哪些差异?
谢谢!
4个回答

5
最重要的区别在于像 .bashrc 这样的文件不会在 cron 作业之前执行,因此许多在命令行中正常存在的环境变量将会丢失。因此,如果您的程序在 cron 作业中无法运行,请将其嵌入到一个脚本中,并设置所有必要的环境变量。
关于输入和输出,显然没有用户交互用于 cron 作业,因此程序不应期望输入(如果需要,请从输入文件或直接在脚本中提供),并且任何输出应重定向到日志文件中。

1
一个小提示:Java程序有时会使用AWT函数,即使它们根本没有GUI。特别是当它们操作图像时,但也例如在计算列宽度时使用HSSF。这些程序必须在cron作业中使用-Djava.awt.headless=true启动,否则它们会因为cron中没有X而崩溃。在XTerm的命令行中,您根本不会注意到这一点... - Erich Kitzmueller

2

如果以root身份从命令行调用,此可执行文件可以正常运行,但我发现当由cron作业自动执行时,某些命令会失败。

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

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

我正在指定每天以www-data身份运行'do_work.php'...此文件将位于/etc/cron.d/中。

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

1

主要是:

  • 当前工作目录 - 无法保证从定时任务的环境中会是什么,它可能是$HOME,但不要指望它一定是这样
  • 环境变量 - 大多数您为普通登录设置的环境变量将不会设置,因此需要特定值的环境变量可能会失败,尤其是$PATH。
  • 标准输入/输出/错误输出将不是终端,因此某些程序会因此而表现不同(stdout和err可能是临时文件;stdin可能为空)

但实际上您不能依赖太多东西

  • 用户ID、组ID和附加组应设置为定时作业所有者的正常登录

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接