Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Script zum Rechner herunterfahren

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

niemalsaufgeben
Newbie
Newbie
Beiträge: 40
Registriert: 15. Sep 2004, 16:00

Script zum Rechner herunterfahren

Beitrag von niemalsaufgeben »

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
Newbie
Beiträge: 4
Registriert: 29. Nov 2004, 16:36

Beitrag von dlange »

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: Alles auswählen

netstat -a | grep ftp
eingeben bekomme ein Ergebis das wie folgt aussieht:

Code: Alles auswählen

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: Alles auswählen

netstat -a | grep 6666
Dann könnte ein Erbegniss wie folgt aussehen:

Code: Alles auswählen

D4865026.6666         10.67.41.15.1038     32583      0 24820      0 CLOSING
Jetzt vielleicht noch einwenig verfeinern

Code: Alles auswählen

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: Alles auswählen

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
niemalsaufgeben
Newbie
Newbie
Beiträge: 40
Registriert: 15. Sep 2004, 16:00

Beitrag von niemalsaufgeben »

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??
Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3174
Registriert: 25. Aug 2004, 02:13

Beitrag von robi »

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
niemalsaufgeben
Newbie
Newbie
Beiträge: 40
Registriert: 15. Sep 2004, 16:00

Beitrag von niemalsaufgeben »

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?
Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3174
Registriert: 25. Aug 2004, 02:13

Beitrag von robi »

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: Alles auswählen

#!/bin/bash
Wenn du einen Kommentar einfügen willst dann das erste Zeichen in der Zeile #

Code: Alles auswählen

# 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
dlange
Newbie
Newbie
Beiträge: 4
Registriert: 29. Nov 2004, 16:36

Beitrag von dlange »

Dann brauch ich ja nichts mehr schreiben.
Viel Erfolg! :D
niemalsaufgeben
Newbie
Newbie
Beiträge: 40
Registriert: 15. Sep 2004, 16:00

Beitrag von niemalsaufgeben »

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.
niemalsaufgeben
Newbie
Newbie
Beiträge: 40
Registriert: 15. Sep 2004, 16:00

Beitrag von niemalsaufgeben »

Es gibt da ein Problem...
mit dem Code...
Ich bekomme folgenden Fehler:

Code: Alles auswählen

./Shutdown.sh : Line 3: TRUE: command not found
bei diesem Script:

Code: Alles auswählen

#!/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??
Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3174
Registriert: 25. Aug 2004, 02:13

Beitrag von robi »

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
niemalsaufgeben
Newbie
Newbie
Beiträge: 40
Registriert: 15. Sep 2004, 16:00

Beitrag von niemalsaufgeben »

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...
niemalsaufgeben
Newbie
Newbie
Beiträge: 40
Registriert: 15. Sep 2004, 16:00

Beitrag von niemalsaufgeben »

Ich mir jetzt hier mal was zusammengebastelt. Manch einer wird nur die AUgen verdrehen, aber ich denke dass es ein guter Anfang ist:

Code: Alles auswählen

#!/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?
Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3174
Registriert: 25. Aug 2004, 02:13

Beitrag von robi »

schau mal ob sowas hier läuft, hab grad kein UNIX zur Hand zum testen

Code: Alles auswählen

#!/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
niemalsaufgeben
Newbie
Newbie
Beiträge: 40
Registriert: 15. Sep 2004, 16:00

Beitrag von niemalsaufgeben »

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?
Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3174
Registriert: 25. Aug 2004, 02:13

Beitrag von robi »

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
niemalsaufgeben
Newbie
Newbie
Beiträge: 40
Registriert: 15. Sep 2004, 16:00

Beitrag von niemalsaufgeben »

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: Alles auswählen

#!/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.
Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3174
Registriert: 25. Aug 2004, 02:13

Beitrag von robi »

wie wäre es mal, wenn du in die Schleife nen Befehl schreibst.

Code: Alles auswählen

#!/bin/bash 
 
 typeset -i i 
 i=0 
  while [ $i -lt 10 ] 
 do 
    i=$i+1
    echo $i
 done
robi
niemalsaufgeben
Newbie
Newbie
Beiträge: 40
Registriert: 15. Sep 2004, 16:00

Beitrag von niemalsaufgeben »

Das hatte ich auch bereits ausprobiert, der selbe Fehler. Immer unexpected end of file, auch wenn ich exit 0 dahinter schreibe.
Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3174
Registriert: 25. Aug 2004, 02:13

Beitrag von robi »

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
niemalsaufgeben
Newbie
Newbie
Beiträge: 40
Registriert: 15. Sep 2004, 16:00

Beitrag von niemalsaufgeben »

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??
Antworten