Computer herunterfahren

68

Gibt es eine Möglichkeit, einen Computer mit einer integrierten Java-Methode herunterzufahren?

jjnguy
quelle

Antworten:

92

Erstellen Sie Ihre eigene Funktion ein Betriebssystem zum Ausführen - Befehl über die Befehlszeile ?

Zum Beispiel. Aber wissen Sie, wo und warum Sie dies verwenden möchten, wie andere bemerken.

public static void main(String arg[]) throws IOException{
    Runtime runtime = Runtime.getRuntime();
    Process proc = runtime.exec("shutdown -s -t 0");
    System.exit(0);
}
David McGraw
quelle
115
+1 nichts ist mehr Java als diese Zeile - Runtime runtime = Runtime.getRuntime ();
BRampersad
Der erste Link in der Antwort ist veraltet.
Pang
81

Hier ist ein weiteres Beispiel, das plattformübergreifend funktionieren könnte:

public static void shutdown() throws RuntimeException, IOException {
    String shutdownCommand;
    String operatingSystem = System.getProperty("os.name");

    if ("Linux".equals(operatingSystem) || "Mac OS X".equals(operatingSystem)) {
        shutdownCommand = "shutdown -h now";
    }
    else if ("Windows".equals(operatingSystem)) {
        shutdownCommand = "shutdown.exe -s -t 0";
    }
    else {
        throw new RuntimeException("Unsupported operating system.");
    }

    Runtime.getRuntime().exec(shutdownCommand);
    System.exit(0);
}

Die spezifischen Befehle zum Herunterfahren erfordern möglicherweise unterschiedliche Pfade oder Administratorrechte.

David Crow
quelle
Mein einziges Problem dabei ist die Zukunft. Was ist, wenn eine andere Art von Betriebssystem herauskommt und jemand eine JVM dafür erstellt?
Ben Leggiero
22
dann fügen Sie die neue Bedingung hinzu ... Software ist nie fertig.
Gubatron
37

Hier ist ein Beispiel für die Verwendung von SystemUtils von Apache Commons Lang :

public static boolean shutdown(int time) throws IOException {
    String shutdownCommand = null, t = time == 0 ? "now" : String.valueOf(time);

    if(SystemUtils.IS_OS_AIX)
        shutdownCommand = "shutdown -Fh " + t;
    else if(SystemUtils.IS_OS_FREE_BSD || SystemUtils.IS_OS_LINUX || SystemUtils.IS_OS_MAC|| SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_NET_BSD || SystemUtils.IS_OS_OPEN_BSD || SystemUtils.IS_OS_UNIX)
        shutdownCommand = "shutdown -h " + t;
    else if(SystemUtils.IS_OS_HP_UX)
        shutdownCommand = "shutdown -hy " + t;
    else if(SystemUtils.IS_OS_IRIX)
        shutdownCommand = "shutdown -y -g " + t;
    else if(SystemUtils.IS_OS_SOLARIS || SystemUtils.IS_OS_SUN_OS)
        shutdownCommand = "shutdown -y -i5 -g" + t;
    else if(SystemUtils.IS_OS_WINDOWS)
        shutdownCommand = "shutdown.exe /s /t " + t;
    else
        return false;

    Runtime.getRuntime().exec(shutdownCommand);
    return true;
}

Diese Methode berücksichtigt viel mehr Betriebssysteme als jede der oben genannten Antworten. Es sieht auch viel schöner aus und ist zuverlässiger als die Überprüfung der os.nameEigenschaft.

Bearbeiten: Unterstützt Delay und alle Windows-Versionen (inkl. 8/10).

Kezz
quelle
Vielen Dank, das ist sehr nützlich! Kennen Sie eine ähnliche Möglichkeit, einen Computer in jedem Betriebssystem in den Ruhezustand zu versetzen?
JFreeman
1
@JFreeman Entschuldigen Sie die späte Antwort, aber für zukünftige Leute, die dies suchen, können Sie die Befehle einfach in den OS-Befehl zum Schlafen ändern. Es enthält jetzt Windows 8+ -Unterstützung.
Kezz
Im Windows-Zweig der Bedingung müssen Sie den t-Wert * 60 multiplizieren, da das Herunterfahren von Windows in Sekunden gemessen wird (gegenüber Minuten im Rest des * nix-Betriebssystems).
Luis U.
22

Die schnelle Antwort lautet nein. Die einzige Möglichkeit, dies zu tun, besteht darin, die betriebssystemspezifischen Befehle aufzurufen, die zum Herunterfahren des Computers führen, sofern Ihre Anwendung über die erforderlichen Berechtigungen verfügt. Dies ist von Natur aus nicht portierbar. Sie müssen also entweder wissen, wo Ihre Anwendung ausgeführt wird, oder verschiedene Methoden für verschiedene Betriebssysteme verwenden und ermitteln, welche verwendet werden soll.

Wilson
quelle
8

Ich benutze dieses Programm, um den Computer in X Minuten herunterzufahren.

   public class Shutdown {
    public static void main(String[] args) {

        int minutes = Integer.valueOf(args[0]);
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {

            @Override
            public void run() {
                ProcessBuilder processBuilder = new ProcessBuilder("shutdown",
                        "/s");
                try {
                    processBuilder.start();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

        }, minutes * 60 * 1000);

        System.out.println(" Shutting down in " + minutes + " minutes");
    }
 }
Jonathan Barbero
quelle
7

Verwenden Sie .startsWith besser als .equals ...

String osName = System.getProperty("os.name");        
if (osName.startsWith("Win")) {
  shutdownCommand = "shutdown.exe -s -t 0";
} else if (osName.startsWith("Linux") || osName.startsWith("Mac")) {
  shutdownCommand = "shutdown -h now";
} else {
  System.err.println("Shutdown unsupported operating system ...");
    //closeApp();
}

funktioniert gut

Ra.

Ra.
quelle
30
Bis jemand ein neues Betriebssystem namens Macaroni verwendet, bei dem das Herunterfahren der Selbstzerstörungsbefehl ist.
Bart van Heukelom
2

Sie können JNI verwenden , um es so zu tun, wie Sie es mit C / C ++ tun würden.

Steve M.
quelle
1

Unter Windows Embedded gibt es standardmäßig keinen Befehl zum Herunterfahren in cmd. In diesem Fall müssen Sie diesen Befehl manuell hinzufügen oder die Funktion ExitWindowsEx von win32 (user32.lib) verwenden, indem Sie JNA (wenn Sie mehr Java möchten) oder JNI (wenn es für Sie einfacher ist, Privilegien in C-Code festzulegen) verwenden.

Waldemar Wosiński
quelle
1

einfache einzeilige

Runtime.getRuntime().exec("shutdown -s -t 0");

aber nur unter Windows arbeiten

Andrea Bori
quelle