ubuntu查看python程序的pid_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 &

三、 部分参考内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值