如何在不使用命令的情况下以编程方式关闭/重启linux机器(运行时)

时间:2016-10-31 22:44:06

标签: java linux jna dbus

在Windows中,可以通过本机(JNA)在Windows API中调用ExitWindowsEx函数来通过java程序关闭计算机。我在linux中寻找类似的东西。我知道这可以通过执行命令来完成,但我不能依赖于解析人类可读的文本。

IPC(DBus)是执行此操作的唯一方法,还是可以本机加载某些库并本机调用shutdown方法。如果有更简单的方法,请告诉我。

Using JNA or similar to shutdown and restart computer in linux and mac

我之前看过这个问题,但它没有提供关于如何以编程方式进行操作的答案。

2 个答案:

答案 0 :(得分:0)

你的程序不能只调用sh并执行shutdown命令吗?像那样(需要root):

system("shutdown");

或者如果是桌面会话:

system("dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true");

或者您可以改为包含DBus连接器库并进行正确的IPC调用。

答案 1 :(得分:0)

所以我在网上做了一些研究之后,我自己找到了解决方案。有一个名为JNA(Java Native Access)的库,它允许您本机加载库以及解析和依赖。使用JNA我通过接口在java上加载了POSIX库。将代码作为sudo运行将允许您关闭或重新启动计算机。这是代码。

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.ptr.IntByReference;

public interface CLibrary extends Library {
public CLibrary INSTANCE = (CLibrary) Native.loadLibrary(Platform.isWindows()?"msvcrt":"c",CLibrary.class);

int kill(long pid, int sig);
int reboot(int magic, int magic2, int cmd, IntByReference arg);
int reboot(int cmd);

int LINUX_REBOOT_MAGIC1 = 0xfee1dead;
int LINUX_REBOOT_MAGIC2 = 672274793;
int LINUX_REBOOT_MAGIC2A = 85072278;
int LINUX_REBOOT_MAGIC2B = 369367448;
int LINUX_REBOOT_MAGIC2C = 537993216;

int LINUX_REBOOT_CMD_RESTART = 0x01234567;
int LINUX_REBOOT_CMD_HALT = 0xCDEF0123;
int LINUX_REBOOT_CMD_CAD_ON =0x89ABCDEF;
int LINUX_REBOOT_CMD_CAD_OFF = 0x00000000;
int LINUX_REBOOT_CMD_POWER_OFF = 0x4321FEDC;
int LINUX_REBOOT_CMD_RESTART2 = 0xA1B2C3D4;
int LINUX_REBOOT_CMD_SW_SUSPEND = 0xD000FCE2;
int LINUX_REBOOT_CMD_KEXEC = 0x45584543;

}

p s v main(){
   CLibrary.INSTANCE.reboot(Clibrary.LINUX_REBOOT_CMD_POWER_OFF);
}

注意:这仅适用于Linux而不适用于Windows。要以编程方式关闭计算机,请查找ExitWindowsEx。内置于JNA库中。

可以找到所有C POSIX头文件C POSIX Library - Wikipedia