Linux Herunterfahren...[gelöst}

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Linux Herunterfahren...

Beitrag von pluto »

In sofern ist das nicht "der Preis der Freiheit", sondern ein sinnvolles Feature.

Ansichtssache. In einem Netzwerk mag das ja Sinnvoll sein, aber ich arbeite an meinem Rechner zu Hause alleine dran. Da währe es Egal. bei mir jedenfalls. Da machen die ganzen Passwörter sowieso nicht so viel Sinn....
MFG
Michael Springwald

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Re: Linux Herunterfahren...

Beitrag von khh »

corpsman hat geschrieben:Dieses Cron von dem ihr da sprecht kannte., kenne ich nicht.




"dieser Cron" ist meiner Meinung nach Basiswissen unter Unix.
Wenn du den nicht kennst, gehe ich davon aus, dass du von Unix nicht all zu viel Ahnung hast.
Damit solltest lieber die Finger von BS-Funktionen weg lassen.

Gruss KH

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Linux Herunterfahren...

Beitrag von corpsman »

Es Stimmt wohl das ich neu bin beu Linux,

Und weil ich weis das man nicht einfach so im System Rumpfuscht, frage ich ja hier nach. Um den Schaden Minimal und den gewünschten Maximal zu halten.
--
Just try it

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Linux Herunterfahren...

Beitrag von pluto »

Damit solltest lieber die Finger von BS-Funktionen weg lassen.

Naja, das Runter fahren kann eigentlich nicht so viel Schaden verursachen. Das Problem ist halt nur, wenn man hier was falsches Einträgt, fährt der Rechner z.b. alle paar Sekunden runter *G*.
MFG
Michael Springwald

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Linux Herunterfahren...

Beitrag von Targion »

Das über Cronjobs zu erledigen finde ich in diesem Fall auch nicht wirklich die eleganteste Lösung.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Linux Herunterfahren...

Beitrag von Socke »

Targion hat geschrieben:Das über Cronjobs zu erledigen finde ich in diesem Fall auch nicht wirklich die eleganteste Lösung.

Ich dachte, die seien eher dazu gedacht, regelmäßig zur gleichen Zeit eine Aktion auszuführen. Die würden sich schon anbieten, wenn die Zeiten sich nicht (oder eher selten) ändern. Wenn sie aber immer unterschiedlich sind/sein können, gibt es mit Sicherheit bessere Methoden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Linux Herunterfahren...

Beitrag von Targion »

So, ich habe mich ein wenig durch das freedesktop.org Archiv gewühlt (Desktop-Linuxe fahren den Computer mittels ConsoleKit herunter) und dabei die ultimative Lösung gefunden:

Code: Alles auswählen

procedure ShutdownLinux;
var p: TProcess;
begin
if FileExists('/usr/bin/dbus-send') then
begin
 p:=TProcess.Create(nil);
 p.Options:=[poStderrToOutPut];
 writeLn('Shutting down Linux...');
 p.CommandLine:='dbus-send --system --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop';
 p.Execute;
 p.Free;
 halt(0);
end else writeLn('DBus command line utility not found!');
end;

Dieser Code fähr Linux sofort herunter, wenn der Nutzer die Berechtigung durch ConsoleKit erhalten hat. Dafür verantwortlich ist das Paket consolekit (o.Ä.), welches auf jedem Linux-System mit GUI installiert ist. Die Berechtigung wird durch eine Gruppe oder PolicyKit (seit neuestem) geregelt.
ACHTUNG: Die Prozedur fährt Linux sofort herunter, es gibt keine Möglichkeit, noch vorher Daten zu sichern.

EDIT: Fehler im Codeschnipsel korrigiert
Zuletzt geändert von Targion am Mo 10. Aug 2009, 17:51, insgesamt 2-mal geändert.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Linux Herunterfahren...

Beitrag von corpsman »

Also das Paket Konsolekit habe ich installiert:

aber leider, du ahnst es schon :

corpsman@corpsman2:~/Desktop/Shutdown$ ./project1
[WARNING] Out of OEM specific VK codes, changing to unassigned
[WARNING] Out of unassigned VK codes, assigning $FF
Shutting down Linux...
WARNING: TLCLComponent.Destroy with LCLRefCount>0. Hint: Maybe the component is processing an event?
process 5404: arguments to dbus_message_set_destination() were incorrect, assertion "destination == NULL || _dbus_check_is_valid_bus_name (destination)" failed in file dbus-message.c line 2891.
This is normally a bug in some application using the D-Bus library.
Not enough memory
corpsman@corpsman2:~/Desktop/Shutdown$


Und dann passiert nichts mehr, sprich das System fährt nicht herunter :(

[Edit]

Generell scheint das Process ding aber zu gehen, denn wenn ich stattdessen schreibe :

Code: Alles auswählen

procedure ShutdownLinux;
var p: TProcess;
begin
if FileExists('/usr/bin/dbus-send') then
begin
 p:=TProcess.Create(nil);
 p.Options:=[];
 writeLn('Shutting down Linux...');
 p.CommandLine:= 'gwenview';
 //'dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop';
 p.Execute;
 p.Free;
 halt(0);
end else writeLn('DBus command line utility not found!');
end;


dann öffnet sich gwenview...

[Edit2]

Der Befehl scheint aber zu gehen, denn wenn ich

dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop


in einer Konsole eingebe ist der Rechner schneller aus, als das ich noch irgendwas klicken kann ...

Gibts da evtl noch nen anderen Modus das der Process den Befehl Ausführt ?
--
Just try it

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Linux Herunterfahren...

Beitrag von Targion »

Könnte mal jemand anderes das Teil testen? Bei mir funktioniert's nämlich perfekt.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Linux Herunterfahren...

Beitrag von corpsman »

ho Targio, magst du mal meine Binary ausführen, wenn das Programm bei dir den selben Fehler erzeugt, liegts wohl an meinem Compiler ...
Dateianhänge
project1.tar.gz
(1.29 MiB) 79-mal heruntergeladen
--
Just try it

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Linux Herunterfahren...

Beitrag von Targion »

Da war noch ein kleines Problem in meinem Code. Hast du die neue Variante (ich habe einfach den Beitrag geändert) mal ausprobiert? Funktioniert bei mir. Zuvor waren noch ein paar überflüssige Anführungszeichen drinn, die die korrekte Funktion des Befehls verhinderten.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Linux Herunterfahren...

Beitrag von theo »

Probier mal so, mit der libhal unit aus diesem Thread viewtopic.php?p=30962#p30962.
Hibernate funzt bei mir, Shutdown habe ich nicht getestet, müsste aber auch gehen.
Habe ich nur eben übersetzt. Wenn's nicht geht, musst du vielleicht die Fehlermeldugen ausgeben lassen. Original Code hier:
http://www.share-linux.com/hal2.php
Wenn man hibernaten will, müsste man zuerst noch checken, ob das System das kann (Wenn man's nicht weiss) Das steht hier:
http://www.share-linux.com/hal1.php

Code: Alles auswählen

uses dbus, libhal;
 
procedure PowerManagement(Command: Pchar);
const
  HAL_DBUS_SERVICE = 'org.freedesktop.Hal';
  HAL_ROOT_COMPUTER = '/org/freedesktop/Hal/devices/computer';
  HAL_DBUS_INTERFACE_POWER = 'org.freedesktop.Hal.Device.SystemPowerManagement';
 
var connection: PDBusConnection;
  mess, reply: PDBusMessage;
  error: DBusError;
  exit_code: integer;
begin
  dbus_error_init(@error);
  connection := dbus_bus_get(DBUS_BUS_SYSTEM, @error);
 
  if (dbus_error_is_set(@error) <> 0) then
  begin
        //printf("Unable to connect to the daemon bus: %s",error.message);
    dbus_error_free(@error);
    exit;
  end;
 
 
  mess := dbus_message_new_method_call(HAL_DBUS_SERVICE,
    HAL_ROOT_COMPUTER,
    HAL_DBUS_INTERFACE_POWER,
    Command);
  if (mess = nil) then
  begin
    //printf("Out of memory");
    exit;
  end;
 
  reply := dbus_connection_send_with_reply_and_block(connection,
    mess,
    -1, // Default DBus timeout
    @error);
 
  dbus_message_unref(mess);
 
  if (dbus_error_is_set(@error) <> 0) then
  begin
        //printf("Error occured while trying to hibernate: %s", error.message);
    dbus_error_free(@error);
    exit;
  end;
 
  if (reply = nil) then
  begin
        //printf("Message hibernate didn't get a reply");
    exit;
  end;
 
    // If we have received a reply then there is a return code from the util that HAL executed
  case (dbus_message_get_type(reply)) of
 
    DBUS_MESSAGE_TYPE_METHOD_RETURN: begin
        dbus_message_get_args(reply, nil,
          DBUS_TYPE_INT32,
          [@exit_code,
          DBUS_TYPE_INVALID]);
        dbus_message_unref(reply);
        exit;
      end;
    DBUS_MESSAGE_TYPE_ERROR:
      begin
        dbus_message_unref(reply);
        //printf("Error occured while trying to hibernate");
      end;
  end;
  dbus_connection_unref(connection);
end;
 
//Aufrufen mit
  PowerManagement('Shutdown');         
//  PowerManagement('Hibernate');

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Linux Herunterfahren...

Beitrag von corpsman »

WOW,

also die libhal hab ich nicht gebraucht zum Kompilieren.

Das Hibernate hat er versucht und ist gleich wieder raus gegangen.

Und der Shutdown ging, zack bum und der Rechner war aus.

SUPER,

Vielen Dank für die geduldige Hilfe.
--
Just try it

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Linux Herunterfahren...

Beitrag von theo »

Super!
corpsman hat geschrieben:also die libhal hab ich nicht gebraucht zum Kompilieren.

Ja, stimmt. Aber wenn du's allgemeiner lösen willst, also z.B. herausfinden ob das System überhaupt hibernaten kann und ob man dem User dies anbieten darf, dann brauchst du libhal und den code hier:
http://www.share-linux.com/hal1.php

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Linux Herunterfahren...[gelöst}

Beitrag von theo »

Hier noch ein bisschen netter angerichtet: http://www.theo.ch/lazarus/dbus/powerman.tar.gz

Warnung: Kann ihren Computer herunterfahren, auch als normaler Benutzer.
Benutzung auf eigenes Risiko.

Antworten