【从零建站】错题集(已解决):cron运行.py报错permission denied, can‘t cd /, No module named

本文详细介绍了在Ubuntu服务器上使用cron定时运行Python脚本时遇到的权限问题、找不到模块问题及解决方案。首先,通过chmod调整.sh文件权限,然后解决因.py文件不在服务器本地创建导致的错误,最后确定Python的路径并设置PYTHONPATH环境变量,确保cron能正确执行。通过这些步骤,成功实现cron定时运行Python Flask应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在腾讯云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

  1. permission denied

    permission denied
    

    当不允许cron使用目标.sh文件时调整权限,增加x

    chmod 755 test.sh  # 增加全员x
    
  2. 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运行该文件
    
  3. 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点
# *日
# *月
# *星期, 每次到达如上时间则运行
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值