2016-10-31 6 views
0

В Windows можно завершить работу машины через Java-программу изначально (JNA), вызывая функцию ExitWindowsEx в Windows API. Я ищу что-то подобное в linux. Я знаю, что это можно сделать, выполняя команды, но тогда я не могу полагаться на разборчивый текст, читаемый человеком.Как завершать/перезагружать Linux-машину программно без использования команд (время выполнения)

Это IPC (DBus) единственный способ сделать это или можно загрузить некоторую библиотеку изначально и вызвать метод выключения изначально. Если есть более простой способ сделать это, пожалуйста, дайте мне знать.

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

Я посмотрел на этот вопрос ранее, но это не дает ответа на вопрос, как сделать это программно.

+0

Посмотрите на BusyBox [ 'halt.c'] (https://git.busybox.net/busybox/tree/init/halt.c) –

+0

Можете ли вы использовать SSH? Это, вероятно, лучший человеко-читаемый синтаксический анализ, который вы получите. Это даст вам все до момента выключения. Существует много разновидностей: [Python] (http://stackoverflow.com/questions/3586106/perform-commands-over-ssh-with-python), [Java] (http://stackoverflow.com/questions/995944/ ssh-library-for-java), [C#] (http://stackoverflow.com/questions/11169396/c-sharp-send-a-simple-ssh-command) – ThisClark

+0

@ThisClark Я пытаюсь автоматизировать управление моими серверами , Программа существует, поэтому мне не нужно входить в систему. Я вышлю команды через java-сокеты, чтобы выключить машину. У меня есть настольное приложение, которое подключается к сокету, через который я отправляю команды. – vignesh

ответ

0

Так что мне удалось найти решение самостоятельно после того, как я провел некоторое исследование в Интернете. Существует библиотека под названием JNA (Java Native Access), которая позволяет загружать библиотеки изначально и разрешений и зависимостей. Используя JNA, я загрузил библиотеку POSIX в java через интерфейс. Запуск кода в качестве 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 = 0x; 
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

0

Не может ли ваша программа просто вызвать sh и выполнить команду shutdown? Как, что (нужно корень):

system("shutdown"); 

Или, если это рабочий стол сессии:

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

Или вы можете вместо этого включить библиотеку соединителя DBus и сделать правильный IPC вызов.

+0

Есть ли документ, который предоставляет различные функции, которые я могу получить через dbus? – vignesh

+0

DBus - это механизм вызова. Доступность зависит от того, какие службы установлены. Обычно я смотрю, что доступно через программу dv-ds gbus explorer (или 'gdbus introspect', если в командной строке), а затем выяснить, к какому сервису соответствует объект. Сервисы имеют свою документацию где-то (например, https://www.freedesktop.org/wiki/Software/systemd/logind/). И каждый класс в DBus определяется XML-файлом ("org.freedesktop.login1.xml" для 'login1'). Связи для языков программирования генерируются из этих XML-файлов (например, в SOAP). – Velkan

+0

К сожалению, я не смог найти готовую java-библиотеку, которая смогла соединиться с DBus. Возможно, на следующей итерации SDLC моего продукта я опишу существующую библиотеку DBus, чтобы она работала. Manged, чтобы найти решение через POSIX. – vignesh