本文将介绍如何确定是否从crontab执行了python脚本?的详细情况,特别是关于怎么看crontab有没有执行的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也
本文将介绍如何确定是否从crontab执行了python脚本?的详细情况,特别是关于怎么看crontab有没有执行的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于 Crontab定时任务 - 定时执行python脚本部署、CentOS7 crontab执行python脚本失败解决办法(手动可以执行)、Crontab不会运行python脚本、crontab中部署Python脚本注意事项的知识。
本文目录一览:- 如何确定是否从crontab执行了python脚本?(怎么看crontab有没有执行)
- Crontab定时任务 - 定时执行python脚本部署
- CentOS7 crontab执行python脚本失败解决办法(手动可以执行)
- Crontab不会运行python脚本
- crontab中部署Python脚本注意事项
如何确定是否从crontab执行了python脚本?(怎么看crontab有没有执行)
我想知道如何确定是否从crontab执行了python脚本?
我不需要一个需要添加参数的解决方案,因为我希望即使从导入的模块(而不是主脚本)中也可以检测到该参数。
答案1
小编典典并不是您所要的,而是您想要的是os.isatty(sys.stdout.fileno())
,它告诉您是否stdout
连接到(大致而言)终端。如果将输出通过管道传输到文件或其他进程,或者该进程是从cron运行的,那么它将为false。
Crontab定时任务 - 定时执行python脚本部署
Crontab命令格式:
* * * * * command
M H D m d command
M: 分(0-59)
H:时(0-23)
D:天(1-31)
m: 月(1-12)
d: 周(0-6) 0为星期日
* 代表取值范围内的数字
/ 代表"每"
- 代表从某个数字到某个数字
, 代表离散的取值(取值的列表)
Crontab脚本示例:
- 每分钟执行:
* * * * * python test.py
等价于*/1 * * * * python test.py
注意,每分钟的意思是指,每分钟的第1秒开始执行。 - 每4小时执行:
* */4 * * * python test.py
- 每周日执行:
* * * * 0 python test.py
- 每周六、周日执行:
* * * * 6,0 python test.py
- 每小时的第5分钟执行:
5 * * * * python test.py
Crontab脚本编辑
编辑定时任务:
crontab -e # a 进入编辑模式
加入:0 16 * * * python /opt/test.py
保存,退出即可。
当我们编辑完定时任务过后,记得重载一遍crond
systemctl reload crond.service
启动、停止、重启服务↓
systemctl start crond.service
systemctl stop crond.service
systemctl restart crond.service
设置开机自启:
systemctl enable crond # 开机自启动
crontab -e编辑生成的定时任务,任务记录文件位置
操作过程:
1.举例在a**用户下,创建了如下的定时任务
a**@standby spool]$ crontab -l
*/1 * * * * /home/a**/check_ps_if_exits.sh
备注:通过crontab -l就可以查看当前用户下的定时任务的设定。
2.通过在网上,找了该内容所在的具体的文件
/var/spool/cron目录下,具体的用户名文件中
3.使用a**用户查看该文件
[a**@standby spool]$ cd /var/spool/
You have new mail in /var/spool/mail/a**
[a**@standby spool]$ ls
anacron cron lpd mail plymouth postfix rhsm up2date
[a**@standby spool]$ cd cron/
-bash: cd: cron/: Permission denied
备注:发现权限是不够的,也就是普通过的用户无法进入到cron目录中。
4.使用root用户,查看该文件
[root@standby cron]# pwd
/var/spool/cron
[root@standby cron]# ls -l
total 4
-rw------- 1 a** oinstall 46 Mar 12 20:28 oracle
[root@standby cron]# cat oracle
*/1 * * * * /home/a**/check_ps_if_exits.sh
备注:通过root进入到cron目录中,查看a**文件,与crontab -l输出的内容是一致的。
小结:
linux操作系统中,crontab -l对应的文件是/var/spool/cron目录下的具体的用户名文件。
总结:1. 执行程序的文件的的权限,使其可以执行。2. 添加任务,编辑crontab命令了。如果用vi /etc/crontab命令的话,会列出root的已有任务列表,这是针对系统的服务。如果是想用当前用户执行,可以用命令crontab -e 来打开一个vi编辑自己的任务。
crontab -e
输入:*/5 * * * * python file_path/test.py >> /***/test.log 2>&1
每隔5分钟就,运行一次 file——path目录下的test.py,将日志输出值/***/test.log
中; 2>&1的意思是把错误的输出也输出到标准输出(2表示错误,2>表示错误输出,&表示等同于,1表示正确),因此如果运行出错也会把错误输出到之前定义的log中。
流程:
- 设置定时任务的命令: crontab -e (设定好任务后,不用重启crontab服务, 可以即可生效,不要设定任务的执行时间等于当前或者很临近的,否则可能造成命令不生效)
- 查看定时任务的命令: crontab -l
- 注意设定任务时的,用户; 执行时需要两者一致。
CentOS7 crontab执行python脚本失败解决办法(手动可以执行)
记录一次python脚本在crontab中无法执行,处理过程,及解决办法
一、思路
python文件名:bkhq.py
文件目录:/opt/src/missions
日志目录:/opt/src/missions/logs
需求,每天下午15:41执行(需要python3执行)
那么,放到crontab中定期执行即可,由于是python文件,则写一个bkhq.sh的shell脚本
二、写脚本并放到计划
#vim bkhq.sh
#!/bin/bash
LogFile=/opt/src/missions/logs/bkhq$(date +"%Y-%m-%d").log
source /opt/py3/bin/activate
python /opt/src/missions/bkhq.py >> $LogFile 2>&1
脚本中“source /opt/py3/bin/activate”为封装了python3,执行后,python命令默认python3,非python2
#crontab -e
41 15 * sh /opt/src/missions/bkhq.sh
三、遇到问题
执行后,有错误日志生成,执行不成功,提示无法导入某模块
但是我确实是“source /opt/py3/bin/activate”使用该命令已经是使用python3来执行了,python2无法执行
另外,手动执行可以成功,说明脚本写的是没有问题的
那么,应该是别的问题:
原来 crontab 的运行环境和我们用 root 登录进去的环境都是不同的,需要在运行 Python 脚本前重新设定一下运行的环境变量
四、解决问题
既然手动执行脚本是可以成功的,而linux在启动时候,会调用/etc/profile文件,进行加载环境变量,那么我在脚本中是否也可以先调用下这个文件,开始行动:
我未使用shell脚本,应该都一样
下面“/opt/py3/bin/python”为python3命令(同“source /opt/py3/bin/activate”)
计划任务中,我是这样写:41 15 * * * source /etc/profile; /opt/py3/bin/python /opt/src/missions/bkhq.py > /opt/src/missions/logs/bkhq.log 2>&1
日志中没有再记录错误日志,而记录了执行过程日志,问题解决!
Crontab不会运行python脚本
当我从命令行执行python脚本时,我没有像这样的问题:
[rv @ med240-183 db] $ python formatdb.py
[rv @ med240-183 db] $
当我尝试使用crontab在每个午夜运行脚本时,出现了一系列错误:
import: unable to open X server `'' @ import.c/ImportImageCommand/367./home/rv/ncbi-blast-2.2.23+/db/formatdb.py: line 2: from: command not found/home/rv/ncbi-blast-2.2.23+/db/formatdb.py: line 3: from: command not foundimport: unable to open X server `'' @ import.c/ImportImageCommand/367./home/rv/ncbi-blast-2.2.23+/db/formatdb.py: line 6: syntax error nearunexpected token `(''/home/rv/ncbi-blast-2.2.23+/db/formatdb.py: line 6: `conx = MySQLdb.connect(user = ''root'', passwd = ''******'', db = ''vaxijen_antigens'')''
我的脚本目录如下:
/home/rv/ncbi-blast-2.2.23+/db/
Crontab看起来像:
SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/python/:/home/rv/ncbi-blast-2.2.23+/database_backup:/home/rv/ncbi-blast-2.2.23+/db/MAILTO="******"HOME=/# For details see man 4 crontabs# Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * command to be executed0 0 * * * root /home/rv/ncbi-blast-2.2.23+/database_backup/backup.py0 0 * * * root /home/rv/ncbi-blast-2.2.23+/db/formatdb.py
和我的python脚本看起来像:
import MySQLdbfrom subprocess import callfrom subprocess import Popenimport reconx = MySQLdb.connect (user = ''root'', passwd = ''******'', db = ''vaxijen_antigens'')cursor = conx.cursor()cursor.execute(''select * from sequence'')row = cursor.fetchall()f = open(''vdatabase.fasta'', ''w'')for i in row: f.write(''>''+i[0].strip()+''\n'') #f.write(i[1].strip().replace('' '','''')+''\n'') s = re.sub(r''[^\w]'','''',str(i[1])) s = ''''.join(s) for k in range(0, len(s), 60): f.write(''%s\n'' % (s[k:k+60])) f.write(''\n'')f.closePopen(["formatdb", "-p", "T", "-i", "vdatabase.fasta"]).wait()
答案1
小编典典加
#!/usr/bin/env python
在脚本的开头-现在它正尝试以bash的形式执行脚本,该行显示“我是python脚本,请使用正确的解释器”。它也称为哈希爆炸行,但必须是脚本中的第一行。
crontab中部署Python脚本注意事项
有时候手工执行Python脚本跑的好好的,但是部署到Linux的crontab中后,就会遇到一些问题,最近终于有空整理一下这方面的内容,其实也是自己也踩了一些别人踩过的坑!这里仅仅列举个人遇到的一些小问题,经验和精力问题,不能面面俱到,仅总结一下自己遇到的这些问题。
环境变量问题
cron中的环境变量和系统的环境变量是不一样的,我们可以通过设置定时脚本将cron中的环境变量打印出来,然后一对比,你就能发现差异
* * * * * env > /tmp/env.txt
如果你Python脚本中要获取环境变量的话,那么部署到Crontab作业后就要小心了,很有可能手工运行脚本是正常的,但是部署到Crontab后运行就不正常了,如下所示,我们构造这样一个测试脚本crontab_env_test.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import logging
import os.path
import os
import base64
# 第一步,创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG) # Log等级开关
# 第二步,创建一个handler,用于写入日志文件
log_path = ''/home/konglb/logs/''
log_name = log_path + ''kerry_test.log''
logfile = log_name
file_handler = logging.FileHandler(logfile, mode=''a+'')
file_handler.setLevel(logging.ERROR) # 输出到file的log等级的开关
# 第三步,定义handler的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
file_handler.setFormatter(formatter)
# 第四步,将handler添加到logger里面
logger.addHandler(file_handler)
# 如果需要同時需要在終端上輸出,定義一個streamHandler
print_handler = logging.StreamHandler() # 往屏幕上输出
print_handler.setFormatter(formatter) # 设置屏幕上显示的格式
logger.addHandler(print_handler)
db_user=os.environ.get(''my_env'')
print(db_user)
logger.error(db_user)
如下所示,手工执行该脚本,就会往/home/konglb/logs/kerry_test.log中写入环境变量my_env的值(/etc/profile中设置了export my_env=kerry )
# /usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py
kerry
2019-08-20 20:20:18,293 - crontab_env_test.py[line:30] - ERROR: kerry
然后我们配置crontab后,如下所示,通过刷新日志观察其获取环境变量my_env的值
# crontab -l
*/1 * * * * /usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py
如下截图所示,你会看到在Crontab中运行的Python脚本根本没有获取到环境变量my_env的值
# tail -60f kerry_test.log
2019-08-20 20:20:18,293 - crontab_env_test.py[line:30] - ERROR: kerry
2019-08-20 20:22:02,337 - crontab_env_test.py[line:30] - ERROR: None
2019-08-20 20:23:01,533 - crontab_env_test.py[line:30] - ERROR: None
2019-08-20 20:24:01,682 - crontab_env_test.py[line:30] - ERROR: None
2019-08-20 20:25:01,832 - crontab_env_test.py[line:30] - ERROR: None
2019-08-20 20:26:01,103 - crontab_env_test.py[line:30] - ERROR: None
2019-08-20 20:27:01,243 - crontab_env_test.py[line:30] - ERROR: None
2019-08-20 20:28:01,397 - crontab_env_test.py[line:30] - ERROR: None
2019-08-20 20:29:01,543 - crontab_env_test.py[line:30] - ERROR: None
2019-08-20 20:30:01,680 - crontab_env_test.py[line:30] - ERROR: None
2019-08-20 20:31:01,998 - crontab_env_test.py[line:30] - ERROR: None
2019-08-20 20:32:01,223 - crontab_env_test.py[line:30] - ERROR: None
2019-08-20 20:33:01,369 - crontab_env_test.py[line:30] - ERROR: Non
那么要如何解决这个问题呢,如下所示,在执行Python脚本时,获取/etc/profile中的系统变量(不同平台或不同环境有所区别)
*/1 * * * * source /etc/profile && /usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py
还有一种方案,就是使用shell包裹Python脚本,如下所示:
# more kerry.sh
#!/bin/bash
source /etc/profile
/usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py
*/1 * * * * /home/konglb/python/kerry.sh
相对路径问题
把上面的脚本修改一下,使用相对路径,如下所示,然后crontab作业运行时就会报错
#!/usr/bin/python
# -*- coding: utf-8 -*-
import logging
import os.path
import os
import base64
# 第一步,创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG) # Log等级开关
# 第二步,创建一个handler,用于写入日志文件
#log_path = ''/home/konglb/logs/''
log_path = os.path.dirname(os.getcwd()) + ''/logs/''
log_name = log_path + ''kerry_test.log''
logfile = log_name
file_handler = logging.FileHandler(logfile, mode=''a+'')
file_handler.setLevel(logging.ERROR) # 输出到file的log等级的开关
# 第三步,定义handler的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
file_handler.setFormatter(formatter)
# 第四步,将handler添加到logger里面
logger.addHandler(file_handler)
# 如果需要同時需要在終端上輸出,定義一個streamHandler
print_handler = logging.StreamHandler() # 往屏幕上输出
print_handler.setFormatter(formatter) # 设置屏幕上显示的格式
logger.addHandler(print_handler)
db_user=os.environ.get(''my_env'')
print(db_user)
logger.error(db_user)
其实切换到其它路径后,手工执行该脚本也会报错误,因为相对路径的设置,导致一些逻辑错误出现,如下所示,所以如果要部署为Crontab作业的Python脚本,最好使用绝对路径,避免出现这个问题。
# pwd
/root
# /usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py
Traceback (most recent call last):
File "/home/konglb/python/crontab_env_test.py", line 19, in <module>
file_handler = logging.FileHandler(logfile, mode=''a+'')
File "/usr/local/lib/python3.6/logging/__init__.py", line 1031, in __init__
StreamHandler.__init__(self, self._open())
File "/usr/local/lib/python3.6/logging/__init__.py", line 1060, in _open
return open(self.baseFilename, self.mode, encoding=self.encoding)
FileNotFoundError: [Errno 2] No such file or directory: ''//logs/kerry_test.log''
另外,像密码过期导致crontab不执行作业(Linux账号密码过期会导致crontab作业不能执行)这样的案例也遇到过,不过这个与Python脚本无关系,如果遇到相关问题,可以从Why-Cronjob-Not-Work这篇文章介绍的这几个方面去思考、分析判断。
参考资料:
https://www.tony-yin.site/2018/10/29/Why-Crontab-Not-Work/
关于如何确定是否从crontab执行了python脚本?和怎么看crontab有没有执行的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于 Crontab定时任务 - 定时执行python脚本部署、CentOS7 crontab执行python脚本失败解决办法(手动可以执行)、Crontab不会运行python脚本、crontab中部署Python脚本注意事项的相关知识,请在本站寻找。
本文标签: