问题描述
我有一个简单的外壳脚本,我需要在其中检查我的EMR作业是否正在运行,我只是打印了一个日志,但在使用cron调度脚本时,它似乎不能正常工作,因为它总是打印IF块语句,因为";STATUS_LIVE";var;的值始终为空,所以如果有人可以在此处提出错误的建议,否则在手动运行该脚本时,它会正常工作。
#!/bin/sh
status_live=$(yarn application -list | grep -i "Streaming App")
if [ -z $status_live ]
then
echo "Running spark streaming job again at: "$(date) &
else
echo "Spark Streaming job is running, at: "$(date)
fi
推荐答案
您的脚本无法在cron
中运行,因为cron脚本根本没有环境上下文。
例如,尝试将您的脚本作为没有外壳的其他用户运行nobody
。
sudo -u nobody <script-full-path>
它将失败,因为它没有环境上下文。
解决方案是将用户环境上下文添加到脚本中。只需将source
添加到.bash_profile
sed -i "2a source $HOME/.bash_profile" <script-full-path>
您的脚本应如下所示:
#!/bin/sh
source /home/<your user name>/.bash_profile
status_live=$(yarn application -list | grep -i "Streaming App")
if [ -z $status_live ]
then
echo "Running spark streaming job again at: "$(date) &
else
echo "Spark Streaming job is running, at: "$(date)
fi
现在尝试使用用户nobody
再次运行它,如果运行正常,cron
也将运行。
sudo -u nobody <script-full-path>
请注意,cron
没有标准输出。并且您需要将标准输出从脚本重定向到日志文件。
<script-full-path> >> <logfile-full-path>