UAC 프롬프트 없이 관리자 권한으로 스크립트를 실행할 수 있기 때문에 작업 스케줄러를 사용하여 일부 Auto-HotKey 스크립트를 자동 시작하려고 했습니다.
일반적으로 스크립트는 몇 시간 후에 실패합니다. UAC/explorer.exe/startup 폴더를 통해 실행하면 이러한 모든 스크립트가 며칠 동안 실행되었습니다. (작업 스케줄러를 통해 안정적으로 작동하는 것을 본 유일한 것은 "Hello World" 메시지 상자를 팝업하는 간단한 것뿐이었습니다.)
Process Explorer를 사용하면 taskeng.exe 하위 프로세스의 작업 세트 크기가 항상 감소한 반면(~3,000K에서 512K 정도) UAC/explorer.exe 하위 프로세스는 일정하게 유지되었습니다.
작업 세트 크기를 변경할 수 있는지 확인하기 위해 일부 AHK 코드를 사용해 보았습니다.
pid := DllCall("GetCurrentProcessId")
handle := DllCall("OpenProcess", "UInt", 0x001F0FFF, "Int", 0, "Int", pid)
DllCall("SetProcessWorkingSetSize", "UInt", handle, "Int", 10000000, "Int", 20000000)
DllCall("CloseHandle", "Int", handle)
견인이 작동하지 않는 것 같아서 문제가 해결될지 확실하지 않습니다.
해결책은 실행 파일을 32비트 대신 64비트로 컴파일하는 것이었습니다. 32비트 버전은 내가 사용한 몇 달 동안 시작 폴더를 통해 완벽하게 작동했기 때문에 이전에는 이것을 시도하지 않았습니다.
나는 키보드 후크가 메모리에 로드되었다가 가비지 수집 중에 언로드되면서 문제가 발생했다고 생각합니다. 키보드 후크에 할당된 단축키만 영향을 받았고 RegisterHotkey를 사용하여 할당된 단축키는 영향을 받지 않았습니다.
저는 일주일 넘게 64비트 실행 파일을 사용해 왔고 어느 것도 실패하지 않았습니다. 그러나 일부는 응답이 약간 느렸습니다(백그라운드 프로세스나 Chrome이 리소스를 소모하는 것과 관련이 있을 수 있습니다). 상위 taskeng.exe 및 svchost 프로세스를 종료하거나 다시 시작하면 이 문제가 해결될 수 있습니다. 이것이 작업 세트 재할당을 중지할 수 있는 유일한 방법이었기 때문입니다. (여전히 32비트 문제는 해결되지 않았으며 상위 svchost를 종료하면 몇 가지 새로운 문제가 발생했습니다. ).
[2018-10-03 업데이트: 기본적으로 문제를 해결했습니다.] 작업 스케줄러는 작업이 다른 우선순위로 실행되도록 설정할 수 있지만 사용자 인터페이스에는 이를 표시하지 않습니다.
우선순위를 변경하려면:
- 작업을 XML 파일로 내보냅니다.
- XML 파일을 편집하고 우선순위 태그를 변경하십시오. 보다이 페이지우선순위 목록을 위해.
- StopOnIdleEnd를 "false"로 설정합니다. (테스트하지는 않았지만 마우스/입력 지연이 발생했을 수 있습니다.)
- 수정된 XML 파일을 작업으로 가져오면 제대로 작동합니다.
이런 방식으로 우선순위를 높이면 메모리와 I/O 우선순위도 높아집니다.
AHK 스크립트를 64비트로 컴파일해야 할 수도 있습니다.