我有一个正在运行脚本的 cron 作业。当我通过交互式 shell(ssh 到 bash)运行脚本时,它工作正常。当脚本通过 cron 自行运行时,它会失败。
我的猜测是它正在使用交互式 shell 中设置的一些环境变量。我将对脚本进行故障排除并删除它们。
进行更改后,我知道我可以在 cron 中对脚本进行排队,使其像平常一样运行,但是有没有一种方法可以从命令行运行脚本,但告诉它像从 cron 一样运行 - 即在非交互式环境中?
答案1
从 cron 运行命令与在命令行上运行的主要区别是:
- cron 可能使用不同的 shell(通常
/bin/sh
); - cron 肯定是在一个小环境中运行(哪些环境取决于 cron 实现,因此请检查
cron(8)
或crontab(5)
手册页;通常只有HOME
、 MaybeSHELL
、 MaybeLOGNAME
、 MaybeUSER
和一个小的PATH
); - cron
%
特殊对待该字符(将其转换为换行符); - cron 作业无需终端或图形环境即可运行。
以下调用将运行 shell 片段,就像从 cron 调用它一样。我假设该片段不包含字符'
或%
。
env - HOME="$HOME" USER="$USER" PATH=/usr/bin:/bin /bin/sh -c 'shell snippet' </dev/null >job.log 2>&1
也可以看看从 cron 执行 sh 脚本,这可能有助于解决您的问题。
答案2
要在非交互式 shell 中运行脚本(不考虑 的详细信息cron
),您可以通过 来执行此操作ssh
。
测试一下您是否真的进入了非交互式 shell:
> ssh someuser@somehost tty
not a tty
在非交互式 shell 中执行脚本:
> ssh someuser@somehost /tmp/myscript.sh
答案3
来自@sr_的链接(如何在 ksh shell 中获得干净的环境?),我查找了 env,你可能想尝试这个:
env -i ./my-script.sh
答案4
我建议您在将脚本放入 cron 并在其他地方使用时使用绝对路径,并且对于其中使用的任何和所有 linux 命令,最好将它们声明为变量并使用它!