在腾讯云ubuntu服务器上使用cron定时运行.py时的几个报错
首先假设我们需要使用cron运行如下test.sh文件
#!/bin/sh
cd /home/ubuntu/Programs/pfm_flask && nohup python -u pfm_flask.py runserver --threaded >> pfm_flask.log 2>&1 &
相应的crontab -e命令行如下
0 9 * * * sh /home/ubuntu/Programs/pfm_flask/test.sh > /home/ubuntu/Programs/pfm_flask/pfm_cron.log 2>&1
在此设置下:
cron报错存至 /home/ubuntu/Programs/pfm_flask/pfm_cron.log
.py报错存至 /home/ubuntu/Programs/pfm_flask/pfm_flask.log
-
permission denied
permission denied
当不允许cron使用目标.sh文件时调整权限,增加x
chmod 755 test.sh # 增加全员x
-
can’t cd /…
error: cd: can't cd to /home/ubuntu/programs/prg
如上报错,参考这位大佬,原因是我用了pycharm专业版远程创建了.sh文件,而必须要在服务器创建.sh才行,如下
touch test.sh # 在目标目录下创建.sh文件 chmod 755 test.sh # 修改.sh文件的读写权限,允许cron运行该文件
-
ImportError: No module named …
这是由于cron运行时不能获得ubuntu账号登录运行时的python相关地址,因此采用如下方式找到相应的地址(参考这里)
> which python # 获得python本身的路径 /usr/bin/python > python > import sys > sys.path # 进入python获得python调用包的路径 ['', '/usr/lib/python3.9/lib/python39.zip', '/usr/lib/python3.9/lib/python3.9', '/usr/lib/python3.9/lib/python3.9/lib-dynload', '/home/ubuntu/.local/lib/python3.9/site-packages', '/usr/lib/python3.9/lib/python3.9/site-packages' ] # 这个列表中的最后两项即是包路径
通过如上方式获得路径后,增加到.sh文件中
#!/bin/bash # sh不支持source, 因此修改为bash export PYTHONPATH=/home/ubuntu/.local/lib/python3.9/site-packages:/usr/lib/python3.9/lib/python3.9/site-packages:$PYTHONPATH # 重要:补充上文查找到的PYTHONPATH cd /home/ubuntu/Programs/pfm_flask && nohup /usr/bin/python -u pfm_flask.py runserver --threaded >> pfm_flask.log 2>&1 & # 修改python为上文查到的绝对路径的/usr/bin/python
上述修改即可;也有人推荐了如下修改,实测不适合上述情况
source /etc/profile # 实测这一句不需要;补充非登录状况下配置文件 source ~/.bashrc # 实测这一句不需要;同上 export PATH=/home/ubuntu/.local/lib:/usr/lib:/home/ubuntu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:PATH # 实测不需要
如果用了source命令,就需要将#!/bin/sh中的sh改成bash,相应的cron命令也需要修改为bash
最终可运行的脚本
创建test.sh
> cd /home/ubuntu/Programs/pfm_flask # 项目路径
> ls
pfm_flask.py # 项目路径下需要运行的.py文件名
> touch test.sh
> chmod 755 test.sh
test.sh
#!/bin/bash
export PYTHONPATH=/home/ubuntu/.local/lib/python3.9/site-packages:/usr/lib/python3.9/lib/python3.9/site-packages:$PYTHONPATH
# 指定python路径
cd /home/ubuntu/Programs/pfm_flask && nohup /usr/bin/python -u pfm_flask.py runserver --threaded >> pfm_flask.log 2>&1 &
# 先控制cron进入项目路径
# &&: 下一行命令
# nohup: no hang up
# /usr/bin/python: 需要前面查明的绝对路径调起python
# -u: 兼容err和log写入?忘记了
# runserver --threaded: 测试flask.py的并发权宜之计
# >> pfm_flask.log: 这个.py文件运行log的存放地址
# 2>&1: 错误日志存入同一个(pfm_flask.log)文件
# &: 后台运行
crontab -e
0 9 * * * bash /home/ubuntu/Programs/pfm_flask/test.sh > /home/ubuntu/Programs/pfm_flask/pfm_cron.log 2>&1
# 0分
# 9点
# *日
# *月
# *星期, 每次到达如上时间则运行