java - 使用包装器通过 Runtime.exec() 运行命令

标签 java wrapper

我有服务器和客户端,客户端使用 wrapper 在后台运行。服务器使用 SocketChannels 向客户端发送命令,客户端以这种方式运行命令:

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

当我像平常一样从控制台运行客户端时,这很有效。但是当我将它作为 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)运行。我想知道执行此操作的正确方法是什么(同样,从控制台它可以工作)。

最佳答案

默认情况下,Windows 服务无法与桌面交互。如果您的命令需要用户通过某些 GUI 做出任何类型的响应,它将挂起。解决此问题的一种方法是允许您的服务与桌面交互(在 SCM 中的服务属性上)。另一种方法是简单地避免这种交互。我还没有尝试过,但我认为 -y 开关应该可以解决重新启动的问题。第二个选择是我想要的。

关于java - 使用包装器通过 Runtime.exec() 运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11310536/

相关文章:

java - java的cron库

java - 将 int 转换为 String 是否算作自动装箱?

java - Android - 将 XML 布局堆叠在一起

c++ - 为什么 std::reference_wrapper 不是默认可构造的?

c# - 在 native dll 中创建 C++ 类以在 C# 中使用

wrapper - tcl:包装一个同名的proc

javascript - 如何使用 jQuery 将各种元素包装在一个 div 标签中?

java - 打印 JAXB 生成的 bean

Java Scanner.nextDouble()

c++ - (相对)C++ 中大小安全的包装 STL 容器