ubuntuusers.de

Bash-Skript:Zeitgesteuertes ausschalten

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

busfahrer

Avatar von busfahrer

Anmeldungsdatum:
9. April 2007

Beiträge: 3052

Hallo

da ich vom skripten nicht so viel Ahnung habe und ausgehen von diesem Thread dachte ich mir,ich versuche mal zu Übungszwecken ein Skript zu schreiben das ansatzweise das tut was GShutdown tut.Ich hab das Skript extrem kommentiert,um den Kennern der Szene zu zeigen wie ich die einzelnen Zeilen interpretiere(und mich zu korrigieren).Das Skript funktioniert auf jeden Fall.Jetzt habe ich erst mal 2 Fragen dazu.

1).Ist das grundsätzlich so in Ordnung wie ich es geschrieben habe,oder gibt es irgend etwas das ich grundsätzlich falsch gemacht habe?

2).Wenn ich das Skript ausführe,blockiert es mir natürlich das Terminal.Rufe ich es mit "skript &" auf,funktioniert es nicht.Kann man das irgend wie anstellen das das Terminal wieder freigegeben wird?

Hier das Skript

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#! /bin/bash


TIME=$(date +%H:%M) # Aktuelle Uhrzeit
SLEEPTIME=5 # Pausenzeit bevor die Schleife neu durchlaufen wird
echo -n "Wann soll der Compuer ausgeschaltet werden(SS:MM)?" # Abfrage zu welcher Uhrzeit der Computer ausgeschaltet werden soll
read SHUTDOWN # Ausschaltzeit in der Variablen "SHUTDOWN" speichern


while true # Endlosschleife
do
  if [ $TIME != $SHUTDOWN ] # Falls "Aktuelle Uhrzeit" ungleich "Ausschaltzeit"
  then                      # dann
    TIME=$(date +%H:%M)     # weise der Variablen "TIME" die jetzt aktuelle Uhrzeit zu
  else                      # andernfalls
    notify-send "Achtung" "Der Rechner wird in 60 Sekunden ausgeschaltet" # Nur zur Kontrolle ob es funktioniert
    sleep 60
    dbus-send --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown # Befehl zum ausschalten
  fi
  sleep $SLEEPTIME # Pause bevor Schleife neu startet
done

In erwartung auf lehrreiche Kommentare

Gruß...busfahrer

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

1).Ist das grundsätzlich so in Ordnung wie ich es geschrieben habe,oder gibt es irgend etwas das ich grundsätzlich falsch gemacht habe?

Joo, hast du, du hast eine Grundlegende Funktionalität des System noch komplizierter nachprogrammiert. Wenn du das System herunterfahren möchtest kannst du den Befehl "shutdown" nutzen, und dort kannst du auch eine Zeitangabe mitgeben. Wenn du denn rechner uum beispiel um 23 Uhr herunterfahren möchtest kannst du einfach folgenden Befehl eintippen.

shutdown -h 23:00

busfahrer

(Themenstarter)
Avatar von busfahrer

Anmeldungsdatum:
9. April 2007

Beiträge: 3052

Hallo

erst mal Danke,aber

Sid Burn schrieb:

Wenn du denn rechner uum beispiel um 23 Uhr herunterfahren möchtest kannst du einfach folgenden Befehl eintippen.

shutdown -h 23:00

Das ist mir schon klar,allerdings sollte das ja wohl ohne Tante "sudo" recht schwer fallen.Mein Gedanke war ja das dies jeder Benutzer machen kann.Ich dachte,offensichtlich fälschlicherweise,das das ersichtlich ist.

Gruß....busfahrer

romanb

Anmeldungsdatum:
16. August 2008

Beiträge: 109

Hallo busfahrer

1).Ist das grundsätzlich so in Ordnung wie ich es geschrieben habe,oder gibt es irgend etwas das ich grundsätzlich falsch gemacht habe?

Wie mein Vorposter schon gesagt hat, es ginge auch einfacher, aber als Einstieg recht gut. Grundsätzlich OK, verbessern kann man jedes Script. z.B. eine Prüfung der eingegeben Zeit, kann bei der Abfrage sonst ins Auge gehen.

* Ich würde Stringvergleiche wie Du sie machst immer in Anführungsstriche setzen [ "$A" != "$B" ]. Probiers einfach mal aus was passiert, wenn eine Variable nicht gesetzt ist.

* Eine Prüfung alle 5 Sekunden macht keinen Sinn, da das Zeitraster 1 Minute ist, du 'verbrätst' damit 11mal soviel Rechenleistung wie nötig (12 Prüfungen pro Minute anstatt einer nötigen)

2).Wenn ich das Skript ausführe,blockiert es mir natürlich das Terminal.Rufe ich es mit "skript &" auf,funktioniert es nicht.Kann man das irgend wie anstellen das das Terminal wieder freigegeben wird?

Ist soweit klar, warum. Du schickst mit '&' dein Script in den Hintergrund, erwartest aber eine Tastatureingabe. Das kann nicht gutgehen.

den ersten Teil (bis nach dem 'read') lässt Du wie es ist. den Rest setzt Du in geschweifte Klammern und hängst dort das '&' an.

Das Script wird dann normal gestartet und fragt die Variable ab, danach wird eine Subshell für den Rest im Hintergrund gestartet,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#! /bin/bash
 
...
read SHUTDOWN # Ausschaltzeit in der Variablen "SHUTDOWN" speichern

 {
while true # Endlosschleife
do
......
done } &

Gruß romanb

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

Statt in einer Schleife zu prüfen, ob es Zeit ist, kannst du auch ausrechnen, wie lange zu schlafen musst:

1
2
3
4
5
6
sleep_until(){
 s=$(($(date +%s --date "$*") - $(date +%s)))  # Übergebene Zeit - aktuelle Zeit, jeweils in Sekunden seit 1.1.1970
 if [ $s -ge 0 ]; then   # negative Zeitspanne ignorieren
   sleep $s;
 fi
}

Das hat auch den Vorteil, dass du für die Zeitangaben alles nehmen kannst, was date versteht:

1
2
3
4
5
sleep_until 15:30      # heute 15:30 Uhr
sleep_until '1 hour'   # in 1 Stunde
sleep_until monday     # nächster Montag 0:00 Uhr
sleep_until tomorrow   # morgen um die gleiche Zeit
sleep_until '15:30 tomorrow'   # morgen 15:30 Uhr

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Das ist mir schon klar,allerdings sollte das ja wohl ohne Tante "sudo" recht schwer fallen.

Die Grundlagendkentnisse von Linux Systemen von Ubuntu Usern ist echt erschreckend. Ansonsten könntest du "sudo" auch so konfigurieren das Benutzer keine Passwörter für "shutdown" eingeben müssen.

Eine andere alternative wäre du setzt "shutdown" einfach "setuid" Recht. "chmod u+s shutdown" und schon kann "jeder" Benutzer des System "shutdown" ohne sudo und ohne Passwort nutzen.

Mein Gedanke war ja das dies jeder Benutzer machen kann.Ich dachte,offensichtlich fälschlicherweise,das das ersichtlich ist.

Primär ging es ja wohl erstmal darum wie man das System "Zeitgesteuert ausschaltet", auch in deiner Beschreibung findet sich nichts zum Problem des ausführens selber. Ich dachte aber das zumindest Grundlagen über die Rechteverwaltung von Linux Systemene, offensichtlich fälschlicherweise, vorhanden sind.

busfahrer

(Themenstarter)
Avatar von busfahrer

Anmeldungsdatum:
9. April 2007

Beiträge: 3052

Sid Burn schrieb:

Die Grundlagendkentnisse von Linux Systemen von Ubuntu Usern ist echt erschreckend. Ansonsten könntest du "sudo" auch so konfigurieren das Benutzer keine Passwörter für "shutdown" eingeben müssen.

Man kann es kaum glauben,aber auch das ist mit klar.

Sid Burn schrieb:

Primär ging es ja wohl erstmal darum wie man das System "Zeitgesteuert ausschaltet", auch in deiner Beschreibung findet sich nichts zum Problem des ausführens selber. Ich dachte aber das zumindest Grundlagen über die Rechteverwaltung von Linux Systemene, offensichtlich fälschlicherweise, vorhanden sind.

Ich gebe zu das ich das was ich erreichen wollte nicht klar beschrieben haben,was dazu führt das wir zwei wohl aneinander vorbei reden.Als ich den von mir im ersten Post verlinkten Thread gelesen habe hatte ich den Eindruck das dort zumindest der ein oder andere User dabei ist,der sich mit seinem Ubuntu (noch) nicht intensiv genug beschäftigt hat um alle Möglichkeiten zu kennen.

Also:Es geht hier nicht um mich und meine bescheidenen Kenntnisse 😉

Es geht um einen User "A" der sein Systen (noch)nicht gut genug kennt und keine Lust,Zeit oder Bock hat ein Sudoers-File zu bearbeiten oder sich mit der Rechteverwaltung herum zu schlagen.Der möchte gerne seinen Rechner zeitgesteuert herunterfahren.Da käme dann mein "gigantisches" Skript ins Spiel 😉

romanb und diesch Vielen Dank für die lehrreichen Antworten.

Gruß...busfahrer

noobunto

Anmeldungsdatum:
30. Juni 2009

Beiträge: 58

Juhu ich kann helfen.

#zuerst setzt du shutdown für alle auf sudo rechte
sudo visudo

ALL ALL=NOPASSWD: /sbin/shutdown         #und addest dort diese Zeile

#Strg+O zum speichen und Strg+X zum beenden

crontab -e
#Min Stun Tag Monat Wochentag Befehl
00 23 * * * sudo shutdown -h now

#oder wie du es halt brauchst, gibt ein wiki zu crontab

ansonsten musst du es halt mit

sudo shutdown -h 23:00

machen und es auf ne Tastenkombination legen oder in die Startprogramme reinlegen.

Hoffe ich konnte helfen

busfahrer

(Themenstarter)
Avatar von busfahrer

Anmeldungsdatum:
9. April 2007

Beiträge: 3052

@noobunto

Es ist nett gemeint,aber spätestens nach dem lesen meines letzten Beitrages hättest du merken müssen das es um genau deinen Lösungsvorschlag nicht geht 😉 Ich danke dir trotzdem.

Gruß...busfahrer

Antworten |