Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash中调度Python脚本?_Python_Bash_Automation_Scheduling - Fatal编程技术网

在Bash中调度Python脚本?

在Bash中调度Python脚本?,python,bash,automation,scheduling,Python,Bash,Automation,Scheduling,我不熟悉python脚本的调度,需要启动一个脚本,以便它可以运行一两天。我不允许在我的环境中使用cron,所以我使用这个bash脚本。我可以做什么简单的测试来确保python文件运行?我怎么知道我的文件在运行?而且,如果它抛出一个错误,我如何确保我得到通知?任何帮助都将不胜感激 #!/usr/bin/bash while true do DATE="$(date +'%d')" MONTH="$(date +'%m')" YEAR="$(date +'%Y')"

我不熟悉python脚本的调度,需要启动一个脚本,以便它可以运行一两天。我不允许在我的环境中使用cron,所以我使用这个bash脚本。我可以做什么简单的测试来确保python文件运行?我怎么知道我的文件在运行?而且,如果它抛出一个错误,我如何确保我得到通知?任何帮助都将不胜感激

#!/usr/bin/bash

while true
do
    DATE="$(date +'%d')"
    MONTH="$(date +'%m')"
    YEAR="$(date +'%Y')"
    HOUR="$(date +'%H')"
    MINUTE="$(date +'%M')"
    if ([ "$DATE" = "27" ]) && [ "$HOUR" = "12" ] && [ "$MINUTE" = "30" ]
    then
                 /my_file.py
        sleep 24h
    fi
done

我添加了一个小片段

使用变量
TRIGGER
,您可以选择脚本(
cron.sh
或您的案例课程
cron.py
)第一次启动的日期

WAIT
确定脚本运行时(
cron
)与下一次运行(例如5分钟或24小时)之间的时间间隔。在我的示例中,我只是等待5分钟,直到下一次运行

然后,我们检查已启动脚本
cron.sh
的进程ID是否存在,并对此作出反应:

  • PID不可用且返回值不为零:我们需要重新启动脚本。 出现了一个错误
  • PID不可用且返回值为零:增加触发器(等待时间)。 没有错误
请注意,这只是一种方法,非常快速和肮脏。 这只能说明如何做到这一点。您现在就可以实现自己的功能(通知、日志等)

此外:

  • 您可以检查cron脚本启动的频率。例如,设置重新启动cron的限制。如果cron脚本连续多次失败,则应取消激活该脚本并通知用户

  • 如果您希望在脚本多次失败时收到通知,我个人喜欢发送邮件的选项:

  • 使用数组和循环,可以监视多个Python或bash脚本

#/usr/bin/bash
#选择每次运行之间的等待时间
等待=“5分钟”
进程\u已启动=错误
tmp_pid=0
#用于启动分离进程
startProcess(){
./cron.sh&>/dev/null&
tmp_pid=$(echo$!)
进程_已启动=真;
返回0
}
#将当前日期设置为起始点
触发器=$(日期+“%d-%m-%y-%H-%m”)
echo“起始点:$TRIGGER”
虽然是真的
做
#检查触发器
如果[$(日期+%d-%m-%y-%H-%m')=“$TRIGGER”];然后
#尚未启动任何流程。现在开始程序
如果[“$process_started”=false];然后
启动过程
echo“已启动脚本:”$(日期+“%d-%m-%y%H:%m:%S”)(PID$tmp\U PID)
fi
#检查是否存在
如果!kill-0$tmp_pid>/dev/null 2>&1;然后
echo“未找到pid为$tmp_pid的进程”>&2
#现在,还没有找到任何进程。
#我们可以检查退出代码以确定
#如果进程已正常退出
等待${tmp\u pid}
如果[$?-等式0];然后
echo“脚本退出正常:$(日期+%d-%m-%y%H:%m:%S')。正在等待另一个$WAIT”
#进程已正常退出。
#重置触发器。
触发器=$(日期+%d-%m-%y-%H-%m'-d“$WAIT”)
echo“新运行入$WAIT:$TRIGGER”
其他的
echo“脚本因错误退出”
#在这里。EG重新启动脚本
启动过程
echo“重新启动的脚本:$(日期+“%d-%m-%y%H:%m:%S”)(PID$tmp\U PID)
fi
fi
睡眠1秒
fi
完成
当然,这也适用于python脚本。只需更改函数
startProcess

startProcess(){
./cron.py&>/dev/null&
tmp_pid=$(echo$!)
进程_已启动=真;
返回0
}
别忘了包括
#/usr/bin/env python3
cron.py
文件中


使用以下
cron.sh

x=1
while [ $x -le 5 ]
do
  x=$(( $x + 1 ))
  sleep 1s
done
exit 0
您将收到以下输出:

Starting Point: 20-10-19-05-22
Started script:  20-10-19 05:22:36  (PID 86402)
No process found with pid 86402
Script exited normal:  20-10-19 05:22:46. Waiting another 5 minutes
New run in 5 minutes: 20-10-19-05-27

因此,您正试图重新实现cron的功能,因为您有一个奇怪的理由不使用它?您认为在这一行中会发生什么而不是运行您的脚本?你只是问如何检查或反应退出状态?考虑添加一个小睡眠(例如,30秒)到循环中。否则,脚本将消耗大量CPU。另外,您是否确定“/my_file.py”(根文件夹中)中的作业路径正确。另请查看: