这是我的问题:用户需要在一天中的特定时段通过remotedesktop登录到Windows服务器。我有一些工作的代码,但我相信线程永远不会正确关闭,因为在给定的时间后程序停止。
我想关闭由AP Scheduler启动的这个帖子,有人能告诉我如何正确地做到这一点吗?我已经尝试加入线程并退出以及._Exit()但是没有工作(或者真的应该工作)我迷失了。
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')
我知道杀死线程通常是不好的做法,但是我真的需要这个程序在任何给定的时间内运行,有人能指出我正确的方向吗?
答案 0 :(得分:0)
如果您使用的是Linux,请考虑以下更改:
1)而不是使用Thread
,只需在后台运行rdesktop命令:
os.system('rdesktop ... &')
2)killall命令找到正在运行的程序,并可选择向它们发送信号。
要查看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
进行探测。