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如何.
gre*_*eth 61
Cron默认只提供此环境:
HOME 用户的主目录LOGNAME 用户的登录信息PATH=/usr/bin:/usr/sbinSHELL=/usr/bin/sh如果需要更多,可以在crontab中的调度表之前找到定义环境的脚本.
Coo*_*kie 47
几种方法:
导出cron env并获取它:
加
* * * * * env > ~/cronenv
Run Code Online (Sandbox Code Playgroud)
到你的crontab,让它运行一次,关闭它然后运行
env - `cat ~/cronenv` /bin/sh
Run Code Online (Sandbox Code Playgroud)
而你现在正处于一个sh拥有cron环境的会话中
把你的环境带到cron
你可以跳过上面的练习,只是. ~/.profile在你的cron工作面前做,例如
* * * * * . ~/.profile; your_command
Run Code Online (Sandbox Code Playgroud)使用屏幕
以上两个解决方案仍然失败,因为它们提供了一个连接到正在运行的X会话的环境,可以访问dbus等等.例如,在Ubuntu上,nmcli(网络管理器)将在上述两种方法中工作,但仍然在cron中失败.
* * * * * /usr/bin/screen -dm
Run Code Online (Sandbox Code Playgroud)
将上面的行添加到cron,让它运行一次,然后将其关闭.连接到您的屏幕会话(屏幕-r).如果您正在检查已创建的屏幕会话(有ps)请注意它们有时是大写字母(例如ps | grep SCREEN)
现在甚至nmcli和类似都会失败.
dim*_*mba 22
你可以运行:
env - your_command arguments
Run Code Online (Sandbox Code Playgroud)
这将使用空环境运行your_command.
tcu*_*rdt 14
取决于帐户的外壳
sudo su
env -i /bin/sh
Run Code Online (Sandbox Code Playgroud)
要么
sudo su
env -i /bin/bash --noprofile --norc
Run Code Online (Sandbox Code Playgroud)
来自http://matthew.mceachen.us/blog/howto-simulate-the-cron-environment-1018.html
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)
因此,系统计时器更有可能在没有进一步麻烦的情况下找到二进制文件.
系统定时器的缺点是,设置它们的时间稍长.首先创建一个"服务"文件来定义要运行的内容,然后创建一个"计时器"文件来定义运行它的计划,最后"启用"计时器以激活它.