Python 在给定时间后从APScheduler启动终止线程
这是我的问题:用户需要在一天中的特定时段通过remotedesktop登录到Windows服务器。我有一个工作位的代码,但我相信线程永远不会正确关闭,因为在给定的时间后,程序停止 我想关闭这个由AP调度程序启动的线程,有人能告诉我如何正确地执行此操作吗?我已经尝试加入线程并退出。但无论是工作还是真正应该工作,我都迷失了方向Python 在给定时间后从APScheduler启动终止线程,python,multithreading,python-3.4,apscheduler,Python,Multithreading,Python 3.4,Apscheduler,这是我的问题:用户需要在一天中的特定时段通过remotedesktop登录到Windows服务器。我有一个工作位的代码,但我相信线程永远不会正确关闭,因为在给定的时间后,程序停止 我想关闭这个由AP调度程序启动的线程,有人能告诉我如何正确地执行此操作吗?我已经尝试加入线程并退出。但无论是工作还是真正应该工作,我都迷失了方向 import sys import os import subprocess import signal import time from apscheduler.sched
import sys
import os
import subprocess
import signal
import time
from apscheduler.scheduler import Scheduler
from pykeyboard import PyKeyboard
from threading import Thread
def rdp_start():
os.system('rdesktop -d domain -u username -p password -g 1600x1050 -a 16 123.123.123.123')
def rdp_check():
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
out, err = p.communicate()
for line in out.splitlines():
if 'rdesktop' in str(line):
print("Rdesktop is running!")
else:
print("Starting rdesktop!")
rdp_job = Thread(target = rdp_start, args = ())
rdp_job.start()
time.sleep(5)
k = PyKeyboard()
k.tap_key(k.enter_key)
#time.sleep(600)
#Where I would like to kill rdp_job, and remove rdp_kill scheduling
def rdp_kill():
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
out, err = p.communicate()
for line in out.splitlines():
if 'rdesktop' in str(line):
pid = int(line.split(None, 1)[0])
os.kill(pid, signal.SIGKILL)
print("Killed RDP")
def idle():
# Stop from sleepin
k = PyKeyboard()
k.tap_key(k.scroll_lock_key)
k.tap_key(k.scroll_lock_key)
sched = Scheduler()
sched.daemonic = False
sched.start()
# Fix screen issues with PyUserInput
os.system('xhost + > /etc/null')
sched.add_cron_job(rdp_check, hour=15)
sched.add_cron_job(rdp_kill, hour=15, minute=8)
sched.add_cron_job(rdp_check, hour=23)
sched.add_cron_job(rdp_kill, hour=23, minute=8)
sched.add_cron_job(rdp_check, hour=7)
sched.add_cron_job(rdp_kill, hour=7, minute=8)
sched.add_cron_job(idle, second='*/60')
我知道杀线程通常是不好的做法,但是我真的需要这个程序在任何给定的时间内运行,有人能告诉我正确的方向吗?< /P> < P>如果你在Linux上,考虑下面的变化:
1不使用线程,只需在后台运行rdesktop命令:os.system('rdesktop ... &')
2该命令查找正在运行的程序,并可选地向其发送信号
要查看rdesktop命令是否正在运行,请向其发送信号0。如果发现某个进程,则返回状态0;如果不存在此类进程,则返回状态>0:
$ killall -0 sleep
$ echo $?
0
$ killall -0 beer
beer: no process found
3要杀死rdesktop:
os.system('killall rdesktop')
注意,上面假设您最多有一个rdesktop进程正在运行,并且您启动了它,因此可以使用killall-0对其进行探测