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

Script zum Rechner herunterfahren

Hallo

Ich habe einen Rechner am laufen, der nach einer einstellbaren Zeit sich abschalten soll. Dazu möchte ich eine Liste von Ports eintragen und eine Zeit festlegen können, nachder der Rechner bei Inaktivität dieser Ports sich herunter fährt. Gibt es da unter Suse 9.0 vielleicht ein Programm mit dem ich soetwas bewältigen könnte, bzw hat jemand mit soetwas bereits Erfahrungen gesammelt von denen es zu berichten gibt?
Wenn ich mehr Ahnung hätte, würde ich ja ein Programm schreiben, aber mein Horizont in Sachen Linux ist noch ein wenig begrenzt. Kann nur was in Sachen C aufweisen.
 

dlange

Newbie
Hallo,

der Beitrag ist schon ein wenig älter und bislang hat noch keinen geantwortet.
Ich werde Dir vielleicht einige Tipps geben können, wie ich es machen würde. Habe aber leider das Problem, dass ich mit Korn-Shell auf einem Solarissystem arbeitet. Deshalb könnten die Ergebnisse im Linux ein wenig anders aussehen und Du mußt es Dir weiter zusammenreimen.

Ich denke, dass es unter Linux auch den Befehl netstat - a geben wird. Wenn ich nun den Befehl
Code:
netstat -a | grep ftp
eingeben bekomme ein Ergebis das wie folgt aussieht:
Code:
D4865026.ftp         10.96.18.2.1042     32249      0 24820      0 ESTABLISHED
D4865026.ftp-data    10.96.18.2.1045     32768      0 26280      0 ESTABLISHED
Alternativ könnte ich nun auch eine Portnummer angeben z.B. 6666
Code:
netstat -a | grep 6666
Dann könnte ein Erbegniss wie folgt aussehen:
Code:
D4865026.6666         10.67.41.15.1038     32583      0 24820      0 CLOSING
Jetzt vielleicht noch einwenig verfeinern
Code:
netstat -a | grep '^D4865026.6666'
wobei D4865026 gerade mein Rechnername ist und Du natürlich Deinen Rechnernamen einbauen solltest.
Nun sollten wir das von Dir gewünschte Ergebnis haben.
Ist kein Port offen, bekommst Du kein Ergebnis angezeigt und netstat gibt einen Fehlercode 1 zurück, der abgefangen und weiter verwertet werden kann.
Kommt der Fehlercode 1 kannst Du mit einem sleep-Befehl eine gewisse Anzahl von Sekunden warten und - so zumindest unter Solaris - mit init 5 das System herunterfahren. Bei Linux wird es wahrscheinlich systemhalt oder ähnliches sein.

Jetzt das ganze in einem schönen Skript packen und es sollte funktionieren? Vielleicht! :)

Ein kleines Skriptbeispiel unter ksh und solaris 8:
Code:
while TRUE
do
netstat -a | grep '^D4865026.6666' > /dev/null
if [[ $? -eq 1 ]]
then
sleep 600 && init 5
fi
sleep 60
done

Hoffe, dass ich Dir helfen konnte oder die Frage richtig verstanden hatte. Es handelt sich hierbei allerdings um ein sehr vereinfachtes Skript. Würde es so meinen Auftraggebern aber niemals überreichen. Läßt sich noch deutlich weiter entwickeln und verfeiner oder haber komplett andere Lösungen.

Gruß
David
 
hallo david

vielen dank für deine mühe. das sieht schonmal sehr gut aus, aber ich hab schon ein problem
mein samba läuft eigentlich sehr gut aber ich kann die ports mit netstat -a | grep tcp einfach nicht finden. eigentlich sollte er tcp 139 haben, aber da ist nichts!?

hast du dafür eine erklärung??
 
A

Anonymous

Gast
versuch mal netstat -an wenn du nach der Portnummer suchst, sonst übersetzt netstat die Portnummer gleich entsprechend der Einträge in der /etc/services

robi
 
Hey genial, vielen Dank soweit. Jetzt klappt es. Nur habe ich mit dem Script noch Probleme. Wie muss ich den Text unterbringen, dass er ausführbar wird und die entsprechenden Rechte bekommt?
 
A

Anonymous

Gast
möchte gar nicht erst suchen wie oft das hier im Club schon in irgendwelchen Beiträgen steht, also noch mal.
Dateiname nach deinem Geschnack wählen. zB. no_samba_then_out.sh
In erste Zeile Programm das dein Script ausführen soll in folgender Form #! /path/program also in deinem Fall
Code:
#!/bin/bash
Wenn du einen Kommentar einfügen willst dann das erste Zeichen in der Zeile #
Code:
# Das hier ist ein Kommentar
# und das hier auch noch
Dann deine Befehle reinschreiben, genau so und in der Reihenfolge als wenn du sie per Hand in der bash eingeben würdest.
Datei speichern.
Danach überlegen, wem soll Datei gehören, in welchem Verzeichniss soll sie stehen und wer soll sie lesen, ändern und ausführen dürfen.
man cd oder man mv ---> helfen dir die Datei dort hin zu bekommen.
man chown und man chgrp ---> helfen dir die Eigentumsrechte zu klären
man chmod ----> hilft dir die Zugriffs und Ausführungsrechte zu setzen.
Script testen --> cd /verzeichnis ; ./program oder
/verzeichnis/program oder
crontab -e (crontabeintrag vornehmen); speichern; warten bis die Zeit reif ist.

robi
 
Hey super
Es ist eben einfach aus mir herausgebrochen. Ich hätte suchen sollen. Danke soweit, ich schätze aber dass ich noch ein zwei Tage brauche um einen Statusbericht abgeben zu können.
 
Es gibt da ein Problem...
mit dem Code...
Ich bekomme folgenden Fehler:
Code:
./Shutdown.sh : Line 3: TRUE: command not found
bei diesem Script:
Code:
#!/bin/bash

while TRUE
 do
 netstat -an | grep 192.168.1.111:139 > /dev/null
 if [[ $? -eq 1 ]]
 then
 sleep 600 && shutdown
 fi
 sleep 60
 done
Ich schätze da muss was anderes rein??
 
A

Anonymous

Gast
Dein Script kann mit TRUE nichts anfangen, es gibt weder eine Variable TRUE noch ein Programm oder FILE namens TRUE.

Ich glaube da musst du dir noch ein paar Gedanken machen,auch was zum Beispiel passiert wenn gerade mal keine Verbindung da war aber während das sleep 600 läuft hat sich wieder einer angemeldet.????

robi
 
Hmmm. Ich dachte, dass mir da jemand mit den paar Zeilen helfen kann, ich kann doch nur C. Mit dem Syntax kenn ich mich hier gar nicht aus. Aber ich suche mal...
 
Ich mir jetzt hier mal was zusammengebastelt. Manch einer wird nur die AUgen verdrehen, aber ich denke dass es ein guter Anfang ist:
Code:
#!/bin/bash

i=1
for i=1
do
 if (netstat -an | grep 192.168.1.111:139)
  then
  count = 0
  else count = count + 1
	if (count = 10)
	then shutdown -h now
	fi
   fi
 sleep 6
done

Nur das mit der for-Schleife geht noch nicht. Es soll einfach eine Endlosschleife sein. Hat da jemand eine Idee?
 
A

Anonymous

Gast
schau mal ob sowas hier läuft, hab grad kein UNIX zur Hand zum testen
Code:
#!/bin/bash
 
typeset -i i
i=0  
while [ $i -lt 10 ] 
 do 
   if [ $(netstat -an | grep 192.168.1.111:139 | wc -l ) -lt 1 ]
    then
      i=0     
   else
      i=$i+1
   fi
  sleep 60
 done
shutdown -h now

robi
 
Genial, das sieht schon sehr gut aus, es ist aber noch ein kleiner Fehler drin. Ich bekomme die Meldung: letzte Zeile (da steht aber Nichts) Syntax Error: unexspected end of file
Was kann das sein?
 
A

Anonymous

Gast
C kennst du ja, also hier könnten es die selben Fehler sein, nicht geschlossene Schleifen, Klammern oder offene Hochkomma, hier kommt nur noch unabgeschlossene Kommandos dazu. Aber nicht in dem Script dass ich gepostet habe. Was da falsch ist, ist die IF-Verzeigung, die ist verkehrt rum. Ändere -lt in -ge und dann stimmts.

robi
 
Ich habe es geändert, aber es hilf nichts. Ich habe mal ein bisschen mit dem Auskommentieren ausprobiert und festgestellt, dass der Fehler bereits kommt wenn nur die while Schleife aktiv ist, also schon bei:
Code:
#!/bin/bash

typeset -i i
i=0

while [ $i -lt 10 ]
do


done

KLammern und den Kram hatte ich ja bereits kontrolliert. Ich schätze mal, dass das ein Problem mit dem while Syntax ist. Und da kenne ich mich leider in dieser Sprache nicht mit aus.
 
A

Anonymous

Gast
wie wäre es mal, wenn du in die Schleife nen Befehl schreibst.
Code:
#!/bin/bash 
 
 typeset -i i 
 i=0 
  while [ $i -lt 10 ] 
 do 
    i=$i+1
    echo $i
 done

robi
 
Das hatte ich auch bereits ausprobiert, der selbe Fehler. Immer unexpected end of file, auch wenn ich exit 0 dahinter schreibe.
 
A

Anonymous

Gast
seltsam ich mache weiter nichts als
vi test.sh
i
(mit drag and drop das script einfügen)
:wq
chmod 700 test.sh
./test.sh
und es funktioniert. Habe es jetzt mehrfach probiert, geht immer.

robi
 
Ich hatte es zuvor im Kwrite gemacht und die Rechte über die Eigenschaften im Konquerer gesetzt. Um sicher zu gehen, habe ich es eben nochmal genauso wie du gemacht. 1 zu 1! Und dann kamen nur Fehler, für jede Zeile einer. Und zwar immer command not found. Stimmt da was mit meinem System nicht??
 
Oben