nohup+python schedule模块——Linux系统(Ubuntu)定时执行python程序(两种方式)之二

一、 schedule模块

1. 安装

pip install schedule

2. 使用方法

import schedule
import time

def job():
    print("I'm working...")

schedule.every(10).seconds.do(job)                       # 每隔10秒执行函数job
schedule.every(10).minutes.do(job)                       # 每隔10分钟执行函数job
schedule.every().hour.do(job)                            # 每隔1小时执行函数job
schedule.every().day.at("10:30").do(job)                 # 每天的10点半执行函数job 
schedule.every().monday.do(job)                          #每周一执行函数job
schedule.every().wednesday.at("13:15").do(job)           #每周三下午1点14分执行函数job

while True:
    schedule.run_pending() #执行任务
    time.sleep(1)

3. 注意

schedule方法是串行的,也就是说,如果各个任务之间时间不冲突,那是没问题的;如果时间有冲突的话,会串行的执行命令,例如以下代码:

import schedule
import time
import threading

def job():
    print("I'm working... in job1  start")
    time.sleep(15)
    print("I'm working... in job1  end")

def job2():
    print("I'm working... in job2")

schedule.every(10).seconds.do(job)
schedule.every(10).seconds.do(job2)

while True:
    schedule.run_pending()
    time.sleep(1)

输出如下:

I’m working… in job1 start
I’m working… in job1 end
I’m working… in job2

4. 使用多线程(不感兴趣可以跳过)

import schedule
import time
import threading

def job():
    print("I'm working... in job1  start")
    time.sleep(15)
    print("I'm working... in job1  end")

def job2():
    print("I'm working... in job2")

def run_threaded(job_func):
     job_thread = threading.Thread(target=job_func)
     job_thread.start()

 schedule.every(10).seconds.do(run_threaded,job)
 schedule.every(10).seconds.do(run_threaded,job2)


while True:
    schedule.run_pending()
    time.sleep(1)

输出如下:

I’m working… in job1 start
I’m working… in job2
I’m working… in job1 start
I’m working… in job2
I’m working… in job1 end

如果想要对线程的数量有所控制,则可以采用如下方法:

import Queue
import time
import threading
import schedule


def job():
    print("I'm working")


def worker_main():
    while 1:
        job_func = jobqueue.get()
        job_func()

jobqueue = Queue.Queue()

schedule.every(10).seconds.do(jobqueue.put, job)
schedule.every(10).seconds.do(jobqueue.put, job)
schedule.every(10).seconds.do(jobqueue.put, job)
schedule.every(10).seconds.do(jobqueue.put, job)
schedule.every(10).seconds.do(jobqueue.put, job)

worker_thread = threading.Thread(target=worker_main)
worker_thread.start()

while 1:
    schedule.run_pending()
    time.sleep(1)

二、 使用nohup命令让python程序后台面挂起

1. 直接上命令

nohup python3 -u /home/ttlz/test.py >> /home/ttlz/test.log 2>&1 &

2. 查看进程

jobs -ljobs命令只看当前终端生效的,关闭终端后,在另一个终端jobs已经无法看到后台跑得程序了
此时利用ps(进程查看命令):
ps aux | grep test.py

3. 杀进程

通过jobs命令查看job号(假设为num),然后执行kill %num
通过ps命令查看job的进程号(PID,假设为pid),然后执行kill pid

4. 用nohup执行python程序时,print无法输出

nohup python3 test.py > test.log 2>&1 &
发现nohup.out中显示不出来python程序中print的东西。
这是因为python的输出有缓冲,导致nohup.out并不能够马上看到输出。
python 有个-u参数,使得python不启用缓冲。
nohup python3 -u test.py > test.log 2>&1 &

5. 2>&1 & 含义

基本含义

  • /dev/null 表示空设备文件
  • 0 表示stdin标准输入
  • 1 表示stdout标准输出
  • 2 表示stderr标准错误

> file 表示将标准输出输出到file中,也就相当于 1>file

2> error 表示将错误输出到error文件中

2>&1 也就表示将错误重定向到标准输出上

2>&1 >file :错误输出到终端,标准输出重定向到文件file,等于 > file 2>&1(标准输出重定向到文件,错误重定向到标准输出)。

& 放在命令到结尾,表示后台运行,防止终端一直被某个进程占用,这样终端可以执行别到任务,配合 >file 2>&1可以将log保存到某个文件中,但如果终端关闭,则进程也停止运行。如 command > file.log 2>&1 &

nohup放在命令的开头,表示不挂起(no hang up),也即,关闭终端或者退出某个账号,进程也继续保持运行状态,一般配合&符号一起使用。如nohup command &

三、 部分参考内容

https://blog.csdn.net/kamendula/article/details/51452352?utm_source=blogxgwz9
https://blog.csdn.net/lovewebeye/article/details/82934049

你可能感兴趣的:(nohup+python schedule模块——Linux系统(Ubuntu)定时执行python程序(两种方式)之二)