一、 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 -l
jobs命令只看当前终端生效的,关闭终端后,在另一个终端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