2012-07-03 4 views
0

클라이언트가 서버 및 클라이언트를 가지고 있으며 클라이언트가 wrapper을 사용하여 백그라운드에서 실행 중입니다. 나는 보통처럼 내가 콘솔에서 클라이언트를 실행할 때래퍼를 사용하여 Runtime.exec()를 통해 명령 실행

Runtime runtime = Runtime.getRuntime(); 
Process proc = runtime.exec(command); 

이 잘 작동 : 서버 SocketChannels를 사용하여 클라이언트와 클라이언트에 명령을 전송하는 명령이 방법을 실행합니다. 그러나 Windows 서비스로 실행하면 일부 명령이 작동하지 않습니다. 예 :

runtime.exec("shutdown -s -t 300");// works perfectly 
runtime.exec("shutdown -a");  // works perfectly 
runtime.exec("shutdown -l");  // works only when client started from console 
// note that these commands will shutdown your computer or log off 

세 번째 명령은 단순히 아무 일도하지 않고 프로그램이 정상적으로 작동합니다. 나는 명령을 무작위 순서로 분리하여 실행하는데 아무런 차이가 없다. Windows를 사용하고 있습니다.

그래서 내가 뭘 잘못하고 있니?

또한 서비스 "notepad.exe"(또는 전체 경로의 다른 .exe)에서 실행할 수 없습니다. 이 작업을 수행하는 올바른 방법이 무엇인지 알고 싶습니다 (다시 콘솔에서 작동 함).

답변

1

기본적으로 Windows 서비스는 데스크톱과 상호 작용할 수 없습니다. 귀하의 명령이 어떤 GUI를 통해 사용자로부터 어떠한 종류의 응답을 요구하는 경우, 응답이 중단됩니다. 이를 해결하는 한 가지 방법은 서비스가 데스크톱과 상호 작용할 수있게하는 것입니다 (SCM의 서비스 속성에서). 다른 방법은 단순히 그러한 상호 작용을 피하는 것입니다. 나는 그것을 시도하지 않았다, 그러나 나는 -y 스위치가 재시작에 대한 문제를 해결해야한다고 생각한다. 두 번째 옵션은 내가 원하는 것입니다.

+0

똑같은'-y' 매개 변수는 아무런 차이가 없으며 콘솔에서만 작동합니다. 도와 주셔서 감사합니다. 어쨌든'-y'를 사용하겠습니다. – alaster

+0

@alaster, 현재 로그인 한 사용자로 서비스 실행을 시도하고 "데스크탑과 상호 작용"옵션을 선택하십시오. 이 명령이 표시되는 UI를보아야합니다. 아마도'-y' 스위치로는 충분하지 않을 수도 있습니다. 또한 Sysinternal의 [PsShutdown] (http://technet.microsoft.com/en-us/sysinternals/bb897541.aspx)을 살펴보십시오. '-f' 플래그가 유망 해 보입니다. – eran

관련 문제