• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

"Shutdown -h now"-Schalter

Josef

Newbie
Hi!

Kennt ihr ein Tool mit Hilfe dessen ein Schalter, der irgendwie per Parralelport oder Usb angeschlossen ist den Befehl "shutdown -h now" ausführt? (PC ohne Keybord, Maus und Bildschirm)

Vielen Dank
Josef
 
OP
J

Josef

Newbie
hmmm...wo war die schnell nochmal, aja das is die taste, wo dann da strom aus is und wo kein einziger prozess beendet wird und genausowenig der swap geleert, etc...
Bei älteren PCs schaltet der Power Off-Knopf direkt die Stromversorgung ab, soweit hab ich auch schon gedacht! Wie kommst du denn darauf dass ich sooo dumm bin? Wieviele N00bs kennst du denn die schon Schalter auf nen Parrallelport montiert haben???

lg
Josef
 

towo

Moderator
Teammitglied
BEi einem ATX-PC wird eben kein Strom abgeschalten und wenn Du bei Linux ACOI nicht deaktiviert hast, dann fährt der PC normalerweiser ganz sauber runter, nach Betätigen der Power-Taste, bei mir funktioniert das auf allen 4 Rechnern, die ich im Haushalt habe.
 
OP
J

Josef

Newbie
sry, war nicht bös gemeint, ich hab mich nur durch deine antwort a bissl verarscht gefühlt, ich bastel grad an einem echt alten Gerät => Pentium I

lg
Josef
 

rolle

Guru
Kannst Du auf den Rechner von außen, also von einem anderen Rechner aus zugreifen? Falls ja, dann fahre ihn doch einfach von dort aus runter.
Oder schließe einfach eine alte Tastatur an, konfiguriere den Powersavedaemon so, daß er Strg-Alt-Entf als 'init 0' übersetzt.
Wenn Du einen immer definierten Zeitpunkt zum Ausschalten hast, dann richte einen passenden Cronjob ein. In Verbindung mit einer Steckdose mit Zeitsteuerung wäre das auch ein gangbarer Weg der Automation.
 
OP
J

Josef

Newbie
Hallo rolle!

Die version mit einem Schlater wäre mir, wenn halbwegs leicht, lieber, aber ich habe auf den PC auch (ausschließlich) http-zugriff, das heißt wenn das so auch geht, kann ichs auch so machen... (da weiß ich aber nicht wie)
Die Tastaturlösung gefällt mir nicht wirklich, da wäre ein knopf doch VIEL komfortabler! Und nein, es gibt keine fixen Zeiten wann er ein-/ausgeschalten wird!

DANKE!
Josef
 

rolle

Guru
Bedeutet 'aussckließlich HTTP', daß Du nicht auch mal vollen Zugriff haben kannst? Falls das doch geht, wäre eine Möglichkeit, Webmin zu installieren, von dem aus kannst Du den Rechner per Browser in einen beliebigen Runlevel, auch 0, schicken. Die Methode mittels eines Schalters dürfte kompliziert werden, Du müßtest Dich in die Untiefen der Hardwareprogrammierung begeben, um einen definierten Befehl einem definierten Signal an einer definierten Schnittstelle..... zuzuweisen. Spontan würde ich sagen, falls Dir tage- oder wochenlange Frickelei nicht zusagt, vergiß die Idee. Da wärst Du besser bedient, wenn Du Dir einen aktuelleren Rechner kaufen würdest.
 

Dr. Glastonbury

Advanced Hacker
Nja,
also mit meinen Rudimentären C-Kenntnissen probier mal das aus:

Code:
##Header includieren
#include <stdio.h>
#include <stdlib.h>

int main()
{
int LPT1_Port =	632;
//Portnummer in Dezimal = 632, Hex = 0x378
int normal = 127;
//Zustand des Ports, wenn schalter nicht gedrückt

   //Rechte auf Port vergeben
   ioperm( LPT1_Port, 3, 1 );

   //Alle Outs ausschalten
   outb( 0, LPT1_Port );


   if( inb( LPT1_Port + 1 ) != normal )
   {
      exit( 0 );
   }
   else
   {
      exit( 1 );
   }

   //Rechte auf Port wieder abgeben
   ioperm( LPT1_Port, 3, 0 );
}
Habs ned getestet! Außerdem musst du die Variable normal evtl. vorher nochmal überprüfen, weil es bei manchen PCs auch n anderer Wert als 127 sein kann.
Das sollte sich dann mit
Code:
gcc -o lptest lptest.c
kompilieren lassen hab das aber schon ewig nimmer gemacht, vielleicht brauchste auch noch n paar mehr Parameter.

Dann machste n kleines Bash-Script:
Code:
rm /tmp/runterfahren
while[ 1 ];
do
if [ test -e /tmp/runterfahren ]; then
    exit;
else
   /da/wo/dein/Programm/liegt/lptest && /sbin/shutdown -h now && touch /tmp/runterfahren;
fi
sleep 1;
done
Jetzt testet das Programm, ob der Knopf gedrückt wurde und wenn ja, dann meldet es den Exit-Status 0 <- der Veranlasst durch das &&, dass shutdown -h now ausgeführt wird und schließlich wird noch ein lock-File angelegt, das verhindert, dass das shudown mehrmals hintereinander ausgeführt wird, denn:
du musst noch in der /etc/init.d/boot.local folgende Zeile einfügen:
Code:
sh /da/wo/dein/script/liegt/script.sh &
Damit wird das ganze beim Booten gestartet und schaut damit Sekündlich, ob die Taste gedrückt wurde. Das & ist besonders wichtig, weil es verhindert, dass du beim Booten an der Stelle, wo das script ausgeführt wird hängen bleibst - das ganze versetzt das Script in den Hintergrund.

Das ganze _muss_ als Root-User laufen, da du einmal shudown nicht als user ausführen darfst und zweitens, da du keinen Treiber verwendest, sondern direkt auf die Schnittstelle gehst auch diese nur als Root auslesen/ansprechen darfst.

Ganz perfekt ist die Lösung mit dem direkten ansprechen der Hardware auch ned, aber sie sollte schon gehn ;)

Narv: ganz vergessen:
An der Parallelen-Schnittstelle musst du mit dem Schalter der Pin 11, 12 oder 13 mit Pin 18-25 (is egal welcher von den 18 - 25) kurzschließen. Dadurch veränderst du letzlich den Wert, den du mit inb einließt. (gibt noch n paar mehr Input-lines, aber die drei sollten denke ich reichen und die fallen mir ausm Stegreif ein^^
 
OP
J

Josef

Newbie
Hi!

Klingt echt super, aber ich hab grad den parrallelport zerlegt und hatte nur 9 Anschlusse, der Rest war nicht mehr verbunden *verwirrt*

lg
Josef
 

Dr. Glastonbury

Advanced Hacker
jengelh schrieb:
Dr. Glastonbury schrieb:
int normal = 127;
//Zustand des Ports, wenn schalter nicht gedrückt
Das ist nicht ganz richtig. Einige Pins werden wieder invertiert,...
Hmm, vielleicht hast du das zu "früh" gelesen... hab noch einige Male meinen Post editiert ;)

Hab aber auch dazu geschrieben, dass dieser Wert abweichen kann. Irgendwie ist das mir immer noch nicht ganz klar, warum der mal so mal so ist -> ich weiß nur, dass es von PC zu PC andere Werte sind...

...und maximal gibt es auch nur 5 statt 8.
Wo hab ich da was von 8 geschrieben? Ich hab drei Eingänge aufgezählt -> falls du Pin 18-25 meinst: Das sind einfach alle Masse-Pins und bei denen ist es egal, welchen man nimmt...

Achja:
hier nochmal die überarbeitete Version -> mit weit weniger Aufwand:
Code:
##Header includieren
#include <stdio.h>
#include <stdlib.h>

int main()
{
int LPT1_Port =   632;
//Portnummer in Dezimal = 632, Hex = 0x378
int normal = 127;
//Zustand des Ports, wenn schalter nicht gedrückt

   //Rechte auf Port vergeben
   ioperm( LPT1_Port, 3, 1 );

   //Alle Outs ausschalten
   outb( 0, LPT1_Port );

   while( 1 )
   {
      if( inb( LPT1_Port + 1 ) != normal )
      {
         //System herunterfahren...
         system( "/sbin/shutdown -h now" );

         //Rechte auf Port wieder abgeben
         ioperm( LPT1_Port, 3, 0 );

         exit( 0 );
      }
      sleep( 1 );
   }
}

Das ganze kompilierste wieder und steckst es dann in die /etc/init.d/boot.local:
Code:
/da/wos/programm/halt/liegt &

Damit sparste dir n Haufen Arbeit mit den Scripts...
Evtl. kannste auch noch n Eintrag in n Logfile machen:

z.B. auch mit
Code:
system ( "echo "`date +'%H:%M:%S Uhr am %d.%m.%Y am d.%m.%Y'`: System shudtown via LPT" >> /var/log/lptshutdown" );

http://de.wikipedia.org/wiki/LPT#Pinbelegungen <- da gibts komplette Beschreibung zum Parallel-Port
 
Die Tatsache, dass du int normal = 127 gesetzt hast, lässt darauf hindeuten, dass 8 Pins gemeint sind (weil 127 = 7x '1' und 1x '0' in binär).
Diese kleine Routine hilft:
Code:
static inline unsigned int decode_lpin(unsigned int value) {
    return (val >> 3) ^ 16;
}
...
int nette_bitmask = decode_lpin(inb(0x379));
Josef schrieb:
Klingt echt super, aber ich hab grad den parrallelport zerlegt und hatte nur 9 Anschlusse, der Rest war nicht mehr verbunden *verwirrt*
Das war dann wohl ein DB9-Serial-Port.
 

Dr. Glastonbury

Advanced Hacker
Hihi^^ - sry - hab 'normal' mir einfach mal ausgeben lassen und hab das dann hergenommen (um genau zu sein, war das von nem Roboterprojekt).

Aber über die Routine von dir freue ich mich sehr, weil ich sowas schon länger mal gesucht hatte ;)
 
Oben