繁体   English   中英

使用 crontab 从 shell 脚本运行 python 脚本

[英]Run python script from shell script using crontab

我有一个 shell 脚本main.sh ,它运行一个 python 脚本main.py 当我手动运行main.sh脚本时,执行很好(注意我使用 root 用户手动运行它)并且 python 脚本按预期工作。 但是,当我从每 30 分钟运行一次 main.sh 脚本的crontab尝试相同的操作时,python 脚本没有被执行。(我已经完成了chmod u+x main.sh以使其可执行)

下面给出的 crontab 也是 root 用户的

我的 crontab 文件: */30 * * * * /home/opc/python_scripts/main.sh >> /home/opc/cron.log

我的 main.sh 文件:

#!/bin/bash
output=$(sh /home/opc/python_scripts/url.sh)
echo "$output"
searchstring="url is up, login service is up and oc console is up"
if [[ "$output" == *"$searchstring"* ]] ; then
    echo "URL is up"
    sudo python3 /home/opc/python_scripts/main.py >> /home/opc/pyfile.log
else
    echo "URL is Down"
    sudo python3 /home/opc/python_scripts/disable_crr.py
fi

我知道它正在输入第一个 if 条件,并且它还在打印“URL is up”语句,我有另一个日志文件记录了这一点。 当我手动运行它时,我可以看到即使 python 脚本运行正常,但是使用 crontab 它卡在echo "URL is up"处,之后没有执行

我为解决这个问题所做的事情:

  1. i have seen solutions of similar questions like- Calling a python script from shell script cron , Shell Script: Execute a python program from within a shell script , but in all of these questions the user was not able to run the python script from the shell手动编写脚本。 我可以手动运行它,但如果我使用cronjob ,那么我遇到了问题。

  2. 当我在这些脚本所在的目录中运行 ls -la 时,这些文件的所有权就像:

main.sh root root  
main.py opc opc

我还在我的 python 脚本的顶部添加了#!/usr/bin/env python3 ,因为我已经将其视为类似问题的解决方案,但没有用,只能手动工作,不能使用 crontab。

我如何使用 crontab 运行它?

您是否尝试删除sudo

但是,由于您必须每 30 分钟运行一次,您也可以考虑:

  • 使用调度直接在 python 中schedule
  • 使用 python 库编写您的 CronTab 文件
  • 使用 docker 在更孤立的环境中运行,并使用 crontab 调度 docker 运行
  • 最后,如果您可以访问它,您也可以考虑在 k8s 集群等上使用 cronjob

您尝试使用 sudo 执行脚本,但 cron 无法提示您输入密码。 由于这是 root 的 crontab,因此您不需要使用 sudo。

如果必须在 cron 中使用 sudo,则需要通过 /etc/sudoers 将这些命令指定为无密码。 这些方面的东西应该起作用。

opc ALL=(root) NOPASSWD: /home/opc/python_scripts/main.py

所以我不知道问题是什么,但我解决了。

如何:

之前正如我在问题中提到的那样,我已经分别尝试了上述两个问题。

  1. 现在我所做的是,实现了Calling a python script from shell script cron的给定答案,其中我只使用了这部分答案:
#!/usr/bin/env bash
dirName=`dirname $0`
baseName=`basename $0`
arg1=$1
arg2=$2
cd ${dirName} && python ./room_wise.py arg1 arg2
  1. from the second question Shell Script: Execute a python program from within a shell script , i used João Víctor answer method 2 and replace python with python3.

我不完全理解问题出在哪里,但是当我同时使用这两种解决方案时,它开始起作用了。 同样正如其他人在这篇文章中提到的那样,如果您使用的是 root 的 crontab,请不要使用 sudo,否则可能会导致授权问题。 这解决了它,如果有人有更好的理解,那么也请添加您的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM