我知道我的问题已经被问过好几次了,但是我的问题没有解决方案。我公司有一个在 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"