代码之家  ›  专栏  ›  技术社区  ›  kolrie

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

  •  2
  • kolrie  · 技术社区  · 15 年前

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

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

    当计划使用crontab定期运行此可执行文件时,在环境(用户、stdin、stdout等)方面应该有什么不同?

    谢谢!

    4 回复  |  直到 15 年前
        1
  •  5
  •   Erich Kitzmueller    15 年前

    最重要的区别是,像.bashrc等文件不会在cron作业之前执行,因此命令行中的许多环境变量将丢失。因此,如果您的程序不能在cron作业中工作,那么就将它嵌入到一个设置所有必要环境变量的脚本中。

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

        2
  •  2
  •   danjarvis    15 年前

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

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

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

    我指定每天运行“do \u work.php”作为WWW数据…此文件将位于/etc/cron.d中/

        3
  •  1
  •   neuviemeporte    15 年前

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

        4
  •  1
  •   MarkR    15 年前

    主要是

    • 当前工作目录-您不能保证这将是什么从cron。可能是$home,但别指望它
    • 环境变量-大多数您为正常登录设置的变量都不会被设置,因此需要环境变量具有特定值的事情可能会失败。其中包括$path。
    • stdin/stdout/stderr不是tty,因此某些程序的行为会因此而有所不同(stdout和err可能是临时文件;stdin可能为空)

    但本质上你不能依赖太多

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