Python 在给定时间后从APScheduler启动终止线程

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

这是我的问题:用户需要在一天中的特定时段通过remotedesktop登录到Windows服务器。我有一个工作位的代码,但我相信线程永远不会正确关闭,因为在给定的时间后,程序停止

我想关闭这个由AP调度程序启动的线程,有人能告诉我如何正确地执行此操作吗?我已经尝试加入线程并退出。但无论是工作还是真正应该工作,我都迷失了方向

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对其进行探测