IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 服务器上运行python的定时任务 -> 正文阅读

[系统运维]服务器上运行python的定时任务

?前情提要:我需要在服务器上运行一个python任务,需要每天生成虚拟的数据,一开始我只写了生成的A.py文件,后来因为这是一个定时任务,所以又建了一个定时调用A的B.py文件。

具体操作流程

首先我尝试了Linux系统的nohup命令,想利用它一直在后台运行B文件。但是它存在一个问题,就是当我关闭命令窗口,nohup运行的定时任务也就停了,后面也找了许多说如何使它保持运行的方法,但一直都不见效。

然后我经理告诉我可以用Linux的crontab命令,这个命令可以直接设置“定时+运行指令”。我先上菜鸟教程看了一下命令的用法,基本熟悉了一下觉得确实很方便。

直接上手,首先查看crontab里有没有运行的命令:

crontab -l

空空如也,我可以放心大胆的操作了。进入crontab的编辑界面(其实前面的crontab -l操作就是把编辑界面的内容展示出来):

crontab -e

如果从来没有用过此命令,初始化的编辑界面会显示一大堆的说明内容,我嫌他碍事及直接删掉了,所以这部分没有截图。在空空的编辑界面写上一个测试定时任务:

* * * * * echo "11" >> /tmp/test

这些*的意思可以在菜鸟里看到,我就不赘述了。这个句子的意思是每一秒都执行echo '11' >> /tmp/test,将11写进根目录下tmp文件夹的test文件。
接下来要保存这个编辑,怎么操作呢?下面有一堆的按键展示:
crontab编辑界面下方按键
其它不用看了,直接Ctrl+O(字母):
ctrl+o之后
眼花缭乱是吧,文件名咱就不要改啦,按下Ctrl+M
CTRL+M之后
按下Ctrl+X完美退场,这时候会出现:
成功更改
就说明保存成功,要是不放心可以按第一条指令查看crontab的运行命令,也可以直接去查看/tmp/test的内容。


进入正题

中间出现了挺多问题的,我先把我最终的处理方法说一下,遇到的问题在后面讲。
首先,我的crontab编辑界面里是一条这样的命令:

0 9 * * * sh /home/**/**/**/run.sh >> /home/**/**/**/run.log

它表示每天9:00运行 /home/**/**/**/路径下的run.sh脚本,脚本的具体内容是:

#!/bin/sh
export PATH=/home/**/**/**/venv/bin/:$PATH
source /home/**/**/**/venv/bin/activate
cd /home/**/**/** && python A.py

脚本中的第一行是不能省略的,省略之后我的不运行。

我遇到的问题

1. A.py的运行需要在我创建的虚拟环境下

这是遇到的最大的问题,我花了一上午时间弄它。前期我已经配好了该文件所要求的虚拟环境,存储在/home/**/**/**/路径下,一开始我的run.sh脚本写的是:

#!/bin/sh
source /home/**/**/**/venv/bin/activate
cd /home/**/**/** && python A.py

但理应创建的文件却没有创建,我在想一定是没有运行py文件,但我的py文件在服务器上手动跑过几次都没有问题,所以我有理由认为是环境没有弄好。为了检验是否是环境的问题,我先尝试着打印我目前的环境,暂时不执行py文件,所以先修改crontab的命令:

crontab -e 
* * * * * sh /home/**/**/**/run.sh 

依次操作Ctrl+OCtrl+MCtrl+X保存crontab。
再修改我的run.sh脚本为:

#!/bin/sh
source /home/**/**/**/venv/bin/activate
echo $PATH >> /tmp/test

显示的$PATH是:

/home/**/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

这时我直接在终端查看当前没有激活虚拟环境的环境变量:

echo $PATH

展示的结果与上面的环境变量一致,这时我们能够确定是因为环境变量的原因导致py文件无法运行。于是我打算先激活虚拟环境后看看环境变量:

source /home/**/**/**/venv/bin/activate
echo $PATH

终端展示:

/home/**/**/**/venv/bin:/home/**/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

经过对比可知,激活虚拟环境后的环境变量和激活之前的相比,前面多出了/home/**/**/**/venv/bin:这部分。所以,run.sh脚本部分增加了export PATH=/home/**/**/**/venv/bin/:$PATH

2. python /home/**/**/**/A.py 跑不起来

这部分很好解决,当我发现这样跑不起来时,我就换了一种写法,cd /home/**/**/** && python A.py先进入文件所在位置再执行命令,虽然不知道是什么原因,但是成功执行了。

3. 不会用命令行读改保存文件内容

这是终端命令行使用的基础,那谁叫我是小白呢,谁都是从零开始的嘛!我用的都是vim命令

vim run.sh

就可以直接在终端界面内展示文件run.sh内容了,之后的操作:

  • A可以修改里面的内容
  • Esc退出编辑的状态
  • 在非编辑状态下输入:wq(终端界面最下方会显示)保存退出
  • 在非编辑状态下输入:q(终端界面最下方会显示)直接退出
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:48:04  更:2022-09-04 01:52:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:56:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码