0

これが私の問題です。ユーザーは、1 日の特定の時間帯にリモートデスクトップ経由で Wi​​ndows サーバーにログインする必要があります。動作するコードがありますが、特定の時間が経過するとプログラムが停止するため、スレッドが正しく閉じられることはないと思います。

AP スケジューラによって開始されたこのスレッドを閉じたいのですが、これを適切に行う方法を誰か教えてもらえますか? スレッドに参加して ._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')

スレッドを強制終了することは一般的に悪い習慣であることは知っていますが、このプログラムを一定時間実行する必要があるのですが、誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

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実行中のプロセスが最大で 1 つあり、それを開始したことを前提としているため、 でプローブできることに注意してくださいkillall -0

于 2014-05-28T20:18:30.573 に答える