在非交互式外壳中运行脚本?


17

我有一个正在运行脚本的cron作业。当我通过交互式外壳程序运行脚本(将其shash为bash)时,它可以正常工作。当脚本通过cron自身运行时,它将失败。

我的猜测是它正在使用交互式外壳程序中设置的一些环境变量。我将对脚本进行故障排除并将其删除。

进行更改后,我知道可以将脚本在cron中排队以使其正常运行,但是有一种方法可以从命令行运行脚本,但告诉它可以从cron中运行-即在非交互式环境中?


相关,因此可能会有所帮助:“如何在ksh shell中获得一个干净的环境?” 尤其参见@Gilles的答案unset
sr_

1
通过@sr_的链接,我抬起头来env,您可能想尝试一下env -i ./my-script.sh。另外,您是否收到错误消息?
凯文

您正在使用什么cron实现?
rozcietrzewiacz

@kevin-如果您回答,我会赞成。
cwd

Answers:


12

从cron运行命令和在命令行运行之间的主要区别是:

  • cron可能正在使用其他外壳(通常是/bin/sh);
  • cron肯定在一个小的环境中运行(这取决于cron的实现,因此请查看cron(8)or crontab(5)手册页;通常只有HOME,也许SHELL,也许LOGNAME,还有USER一个很小的PATH));
  • cron %特别对待字符(将其转换为换行符);
  • cron作业无需终端或图形环境即可运行。

以下调用将运行外壳程序片段,就像从cron调用它一样。我假设该代码段不包含'或字符%

env - HOME="$HOME" USER="$USER" PATH=/usr/bin:/bin /bin/sh -c 'shell snippet' </dev/null >job.log 2>&1

另请参阅从cron执行sh脚本,这可能有助于解决问题。


嗨,@ Giles-刚刚想到了一些事情-是否可以像运行脚本一样sudo -u user /path/to/script运行它而无需设置任何变量?
cwd 2012年

@cwd不,通常不是。sudo清除一些变量并将其他变量设置为已知值,但这取决于其配置方式。例如,通常将其配置为保留区域设置和TERM
吉尔斯(Gillles)“所以别再作恶了”


1

我建议您在将脚本放入cron并在其他地方使用时以及对其中使用的所有Linux命令使用脚本的绝对路径,最好将它们声明为变量并使用它!


是。但是当然。
cwd

0

Cron不一定使用您使用的相同shell。校验:

cat /etc/crontab |grep SHELL

要确定shell并尝试在那里执行脚本-它起作用吗?这是许多人向cron添加脚本的常见问题。

如果这是问题所在,则可以在cron脚本的开头添加“ bash”,以强制此脚本在bash中执行。如果这样做不能解决问题,请告诉我,我将进行更深入的探讨。


0

如果您想忽略某些脚本提供的一些交互式问题,可以尝试:

yes | your_command

或者,yes "n"如果您想全部解决问题。

命令:

是-重复地肯定是输出输出为整数,或者默认为永久“ y”。


0

要在非交互式shell中运行脚本(不考虑的详细信息cron),可以通过进行操作ssh

测试您是否真的最终进入了非交互式外壳:

> ssh someuser@somehost tty
not a tty

在非交互式外壳中执行脚本:

> ssh someuser@somehost /tmp/myscript.sh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.