如何在使用cron进行调度时将命令输出grep到一个外壳脚本中

人气:315 发布:2022-10-16 标签: shell cron amazon-emr grep script

问题描述

我有一个简单的外壳脚本,我需要在其中检查我的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>

254