Linux(redhat);Crontab; bash - 脚本在 shell 中运行但不在 Crontab 中运行 - 将命令分配给变量失败

Linux(redhat);Crontab; bash - 脚本在 shell 中运行但不在 Crontab 中运行 - 将命令分配给变量失败

我知道我的问题已经被问过好几次了,但是我的问题没有解决方案。我公司有一个在 RedHat 机器上运行的应用程序。用户通过 ssh 将基于文本的 GUI 连接到此服务器。此应用程序不支持密码老化和密码重置。

我编写了一个脚本来检查密码有效时间并向每个用户发送电子邮件。

该脚本在 shell 中运行良好,但在 crontab 中不起作用。几项测试(touch testfile)表明 crontab 正在运行并且所有脚本都已执行。我在新脚本的开头使用一个简单的 echo 命令验证了这一点。

通过几次回声进行更深入的调查,我发现将命令分配给变量存在问题。

这种方法已经使用了很多年,并且在多个 crontab 中有效

 VAR = `ls`

我测试了其他版本:

VAR = $(ls)
VAR = `/bin/ls`
VAR = $(/bin/ls)

脚本片段:

(... generating user/email array ...)
echo "----------------START "$LOGDATE" ---------------" >> $LOGFILE

for ((i=0; i<${#USER[*]} ; i++))

do

USERNAME=${USER[$i]}

EMPFAENGERNAME=${EMPFAENGER[$i]}

TEMP1=`chage -l $USERNAME | grep 'Kennwort läuft ab'|cut -d ":" -f2`

(... sending email to user telling him to change password ...)

Crontab:(根)

00 12 * * 1-5 /root/pw_warning.sh

该脚本非常简单,它可以以 root 身份使用,也可以使用 sudo,其实没什么复杂,但我不知道我做错了什么。

更新:

按照建议在 crontab 和脚本中测试了 PATH=(..)。没有任何变化。

再次说明:crontab 正在运行并执行脚本。脚本中的每个命令都在为自己工作,但不是当它应该被分配给变量时。

更新2: 添加 shell 路径不起作用:

   0 0 * * * /bin/bash /path/to/script.sh

更新3:

解决方法:

0 0 * * * ssh root@localhost "/path/to/script"

答案1

Cron 将一组最少的环境变量传递给您的作业。

这里常见的“陷阱”是 PATH 环境变量不同。

为了解决这个问题,只需在脚本顶部设置您自己的 PATH 变量。例如

#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# rest of script follows

您还可以在 crontab 文件中设置 PATH 变量,该变量将应用于所有 cron 作业。例如

PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

15 1 * * * backupscript --incremental /home /root

从这里

此外,根据您使用的变量分配来判断,您的脚本将无法运行/bin/sh,请确保您的第一行是正确的:

#!/bin/bash

或者更好地运行你的脚本

0 0 * * * /bin/bash /path/to/script.sh

而不仅仅是/path/to/script.sh

最后,您可以尝试将以下 hack 代码放入您的 crontab,因为它的工作方式与您自己从 shell 运行脚本的方式完全一样:

 15 1 * * * ssh root@localhost "/path/to/script.sh"

但问题出在你的脚本上。尝试使用一些 bash 脚本模板或者,这应该可以消除任何与变量分配相关的问题。

相关内容