在非交互式 shell 中运行脚本?

在非交互式 shell 中运行脚本?

我有一个正在运行脚本的 cron 作业。当我通过交互式 shell(ssh 到 bash)运行脚本时,它工作正常。当脚本通过 cron 自行运行时,它会失败。

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

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

答案1

从 cron 运行命令与在命令行上运行的主要区别是:

  • cron 可能使用不同的 shell(通常/bin/sh);
  • cron 肯定是在一个小环境中运行(哪些环境取决于 cron 实现,因此请检查cron(8)crontab(5)手册页;通常只有HOME、 Maybe SHELL、 Maybe LOGNAME、 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 命令,最好将它们声明为变量并使用它!

相关内容