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

How to shutdown/reboot linux machine programatically without using commands(Runtime)

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

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

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

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

您的程序不能只调用 sh 并执行关机命令吗?像那样(需要 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 调用。

所以我在网上做了一些研究后设法自己找到了解决方案。有一个名为 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