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

[gelöst] LinuxPC herunterfahren wenn WindowsPC's...

_PASCAL_

Member
Hi,

ich habe einen PC mit Suse10.2 laufen als lokalen Server (mit Samba)

jetzt würde ich gerne folgendes realisieren:

es sind 3 Windows PC und der Linux Rechner in einem Netzwerk mit 2 Router verknüpft.

wenn einer der Windows-PC's angeschaltet wird soll der Linux PC über Wake-ON LAN angegehen (muss an den WindowsPC's Programmiert werden)

jetzt soll der Linux PC aber herunterfahren wenn keiner der WindowsPC's mehr an ist --- d.h. der Linux PC muss ständig (oder min. alle 5 min.) überprüfen ob einer der WindowsPC's läuft, wenn nicht soll er heruntergefahren werden

ist das machbar über ein script ?
 

v.-vega

Member
Erstell dir ein Script, welches via Ping nachschaut ob die Windows PC's an sind. Ist dies nicht der Fall wird der shutdown Befehl ausgeführt.

Das ganze lässt du dann per cron alle X Minuten ausführen.

Die Code Schnipsel findest du bei den Jungs von Google. :lol:
 
OP
P

_PASCAL_

Member
Hi,

danke...

hier mein script ,geht nicht :wink:
Code:
#!/bin/bash

/bin/ping -q -c1 192.168.123.162 &> /dev/null
if [ "$?" -gt 0 ]; then 
	[$1=$1+1]
fi

/bin/ping -q -c1 192.168.123.136 &> /dev/null
if [ "$?" -gt 0 ]; then
	[$1=$1+1]
fi

/bin/ping -q -c1 192.168.123.128 &> /dev/null
if [ "$?" -gt 0 ]; then 
	[$1=$1+1]
fi



if [ "$1" -gt 1 ]; then
        echo "LINUX is going down for sleep :-)"
else
        echo erreichbar!
fi
exit 0

irgendwie funktioniert das mit dem addieren nicht

wie funktioniert eigentlich $? , welcher wert wird in $? geschrieben wenn der Ping Befehl erfolgreich ausgefürht wurde ?

jetzt muss ich noch shutdown einbauen...
 
OP
P

_PASCAL_

Member
so jetzt sollte es funktionieren :D

Code:
#!/bin/bash
ip1=192.168.123.162
ip2=192.168.123.136
ip3=192.168.123.128


/bin/ping -q -c1 $ip1 &> /dev/null
if [ "$?" -eq 0 ]; then 
	 z=$(($z + 1))
	 echo $ip1
fi

/bin/ping -q -c1 $ip2 &> /dev/null
if [ "$?" -eq 0 ]; then
	 z=$(($z + 1))
	 echo $ip2
fi

/bin/ping -q -c1 $ip3 &> /dev/null
if [ "$?" -eq 0 ]; then 
	 z=$(($z + 1))
	 echo $ip3
fi

if [ $z -eq 0 ]; then
        echo "LINUX is going down for sleep :-)"
	sudo shutdown -h now
else
        echo $z erreichbar!
fi
exit 0

wäre nur toll wenn ich die IP's über eine einfach txt datei einlesen könnte
werde mich da mal schlau machen ...
 

pft

Advanced Hacker
Code:
so jetzt sollte es funktionieren
Bist Du sicher?

ich hab gerade kein Unix System zum Testen vor mir aber meiner Meinung nach hat das noch 2 Fehler:
1. Initialisierung:
Code:
z=0
irgendwo ganz vorne einbauen
2. Klammerung. Müsste es nicht heissen:
Code:
z= $z+1
ob du die rechte Seite klammerst sollte wurscht sein, aber m.E. kein "$" davor (nach dem "=")
Das mag keinen sysntax fehler ergeben und ein scheinbar richtiges Ergebnis aber nicht das was Du willst, denn wenn z=0 ergibt das $1 und das ist undefiniert also vermutlich 0, und nicht wie gewollt 0+1=1
 

Leviathan

Hacker
Hab das in meinem Usernetz probiert, geht einwandfrei.
Ob die Bedingungen sinnvoll sind ist ne andere Sache. Vlt. hilft dir ein oder andere Zeile.


down=0;
for i in 1 2 3 300 ;
do ping -q -c 1 172.17.4.$i &> /dev/null ;
if [ $? -ne 0 ];
then echo "down";
let down=down+1;
else
echo "$i up";
fi;
done;

if [ $down -gt 0 ];
then echo "$down Rechner down. shutdown";
else echo "Rechner up";
fi


edit: 1 2 3 300 sind hier IP Adressen. 300 ist ein beispiel fuer nen toten Rechner.

Würde dem ganzen noch ein Timeout mitgeben (option -w) und mindestens 3 Pings pro IP absetzen.
 
OP
P

_PASCAL_

Member
Hi,

ja stimmt z=0 hat gefehlt

so funktioniert es jetzt :

Code:
#!/bin/bash
ip1=192.168.123.162
ip2=192.168.123.136
ip3=192.168.123.128
z=0

/bin/ping -q -c1 $ip1 &> /dev/null
if [ "$?" -eq 0 ]; then 
	 z=$(($z + 1))
	 echo $ip1
fi

/bin/ping -q -c1 $ip2 &> /dev/null
if [ "$?" -eq 0 ]; then
	 z=$(($z + 1))
	 echo $ip2
fi

/bin/ping -q -c1 $ip3 &> /dev/null
if [ "$?" -eq 0 ]; then 
	 z=$(($z + 1))
	 echo $ip3
fi

if [ $z -eq 0 ]; then
        echo "LINUX is going down for SLEEP :-)"
	sudo shutdown -h now
else
        echo $z erreichbar!
fi
exit 0

leider aber nur wenn ich als root angemeldet bin.

der befehlt "shutdown" funktioniert nur als root...

was mach ich jetzt ??? Dieses skript muss funktionieren wenn ich (user) angemeldet bin.

ich lasse das skript via cron ausführen (usercron)

gibt es auch contab's welche ausgeführt werden wenn niemand angemeldet ist?
 

v.-vega

Member
In der /etc/contab kannst du angeben welcher User den Befehl ausführen soll.

Ich meine so in dieser Art (hab gerade nix hier zum nachschauen):

05 * * * * root /Pfad/zur/Datei/Script.sh
 

Leviathan

Hacker
oder Eintrag in /etc/sudoers
---
Cmnd_Alias SHUTDOWN = /sbin/shutdown
nobody ALL=NOPASSWD:SHUTDOWN

Ich würds nicht aktivieren wollen. Ist alles bisschen unverlässlich.
 
OP
P

_PASCAL_

Member
irgendwie werden die crontabs in der datei /etc/crontab nicht ausgeführt

ich versuchs jetzt mal über die andere variante
 
OP
P

_PASCAL_

Member
funktioniert irgendwie nicht...

ich hab mit "vi" die datei editiert und hab genau das was oben steht eingetippt, hab nur nobody mit meinem user ersetzt.

dann mit :wq geschlossen und den PC neu gestartet.

Code:
heinrich@linux-server:~> shutdown -h now
bash: shutdown: command not found
 
Oben