如何模拟环境cron执行脚本?

Jor*_*gas 247 bash scripting cron

我通常有几个问题,cron如何执行脚本,因为他们通常没有我的环境设置.有没有办法以与cron相同的方式调用bash(?),所以我可以在安装之前测试脚本?

mmc*_*coo 377

将此添加到您的cron:

* * * * * env > ~/cronenv
Run Code Online (Sandbox Code Playgroud)

运行后,执行以下操作:

env - `cat ~/cronenv` /bin/sh
Run Code Online (Sandbox Code Playgroud)

这假设你的cron运行/ bin/sh,这是默认的,无论用户的默认shell如何.

  • 好,简单的想法.对于不耐烦的使用'*****'在下一分钟运行,并记得在你完成比赛后再次关闭;-) (10认同)
  • 注意:如果将其添加到全局/ etc/crontab,您也需要用户名.例如*****root env>〜/ cronenv (5认同)
  • @Madsn要返回上一个bash shell,请尝试:exit (5认同)
  • 这个答案的重要性不容小觑.值得将一个段落包含在书中. (5认同)
  • 我将其保存到“/tmp/cronenv”,以避免对“~”在该上下文中的含义产生任何混淆。 (3认同)

gre*_*eth 61

Cron默认只提供此环境:

  • HOME 用户的主目录
  • LOGNAME 用户的登录信息
  • PATH=/usr/bin:/usr/sbin
  • SHELL=/usr/bin/sh

如果需要更多,可以在crontab中的调度表之前找到定义环境的脚本.

  • 由于[安全原因](http://superuser.com/q/156582/2259),`.`通常不再是`PATH`的一部分. (7认同)

Coo*_*kie 47

几种方法:

  1. 导出cron env并获取它:

    * * * * * env > ~/cronenv
    
    Run Code Online (Sandbox Code Playgroud)

    到你的crontab,让它运行一次,关闭它然后运行

    env - `cat ~/cronenv` /bin/sh
    
    Run Code Online (Sandbox Code Playgroud)

    而你现在正处于一个sh拥有cron环境的会话中

  2. 把你的环境带到cron

    你可以跳过上面的练习,只是. ~/.profile在你的cron工作面前做,例如

    * * * * * . ~/.profile; your_command
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用屏幕

    以上两个解决方案仍然失败,因为它们提供了一个连接到正在运行的X会话的环境,可以访问dbus等等.例如,在Ubuntu上,nmcli(网络管理器)将在上述两种方法中工作,但仍然在cron中失败.

    * * * * * /usr/bin/screen -dm
    
    Run Code Online (Sandbox Code Playgroud)

    将上面的行添加到cron,让它运行一次,然后将其关闭.连接到您的屏幕会话(屏幕-r).如果您正在检查已创建的屏幕会话(有ps)请注意它们有时是大写字母(例如ps | grep SCREEN)

    现在甚至nmcli和类似都会失败.

  • 我首选的 Option1 语法是 `env -i $(cat ~/cronenv) /bin/sh`。`-i` 与 `-` (--ignore-environment) 相同,但不那么神秘。`$(...)` 与 `\`...\`` 相同 (2认同)

dim*_*mba 22

你可以运行:

env - your_command arguments
Run Code Online (Sandbox Code Playgroud)

这将使用空环境运行your_command.

  • cron不会在一个完全空的环境中运行,是吗? (4认同)
  • @DragonFax @dimba我使用`env - HOME ="$ HOME"LOGNAME ="$ USER"PATH ="/ usr/bin:/ bin"SHELL ="$(which sh)"命令参数`似乎可以做到这一点 (4认同)
  • gregseth通过cron识别环境中包含的变量.您可以在命令行中包含这些变量.$ env - PATH ="$ PATH"命令args (2认同)

Mar*_*erg 12

六年后回答:环境不匹配问题是systemd"定时器"作为cron替代品解决的问题之一.无论您是从CLI还是通过cron运行systemd"服务",它都会收到完全相同的环境,从而避免了环境不匹配问题.

导致cron作业手动传递失败的最常见问题是cron的限制性默认$PATH设置,这在Ubuntu 16.04上是这样的:

"/usr/bin:/bin"
Run Code Online (Sandbox Code Playgroud)

相比之下,Ubuntu 16.04上的默认$PATH设置systemd是:

"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Run Code Online (Sandbox Code Playgroud)

因此,系统计时器更有可能在没有进一步麻烦的情况下找到二进制文件.

系统定时器的缺点是,设置它们的时间稍长.首先创建一个"服务"文件来定义要运行的内容,然后创建一个"计时器"文件来定义运行它的计划,最后"启用"计时器以激活它.


小智 10

创建一个运行env的cron作业,并将stdout重定向到一个文件.将文件与"env - "一起使用以创建与cron作业相同的环境.