# vixie-cron: Skript fährt Rechner nicht herunter

## Finswimmer

Hi!

```
#!/bin/bash                           

while [ 1 -eq 1 ];do 

        sleep 300

        [ `ps aux|grep -i rsync|grep -vi grep|grep -vi ausschalten|wc -l` -eq 0 ] && [ `who|wc -l` -eq 0 ] && shutdown -h now  0 2>&1 /root/rsync/init-temp

        ps aux|grep -i rsync|grep -vi grep|grep -vi ausschalten > /root/rsync/ps-temp

        who > /root/rsync/who-temp

        date > /root/rsync/date

        shutdown -h now  2>>&1 /root/rsync/init-temp

done

```

Das Skript wird aufgerufen, kein User ist eingeloggt, ps-temp who-temp sind beide leer, init-temp existiert irgendwie nicht.

Wo liegt der Fehler? Darf der User root, wenn er in Cron läuft den Rechner nicht herunterfahren?

Ich bin echt am verzweifeln...

Danke

Tobi

----------

## Evildad

Ein Schuss ins Dunkle.

Absoluter Pfad für shutdown schon verwendet? -> /sbin/shutdown

Btw. bist du dir wirklich sicher, dass ein Aufruf von who nichts mehr anzeigt?

----------

## think4urs11

Irgendwie erschließt sich mir der Sinn des Scripts nicht.

Erst wartest du 5 Minuten, prüfst dann ob noch jemand angemeldet ist bzw. ein rsync läuft und falls nicht wird heruntergefahren - soweit so schön.

Wenn aber noch jemand angemeldet ist wird unmittelbar danach trotzdem heruntergefahren?

Und wozu soll die endlos while-Schleife darum herum eigentlich gut sein?

So wie ich das sehe wird die while nie komplett durchlaufen sondern (sofern shutdown gefunden wird -absoluten Pfad benutzen-) immer vorher durch den shutdown abgewürgt.

----------

## Necoro

```
while [ 1 -eq 1 ]
```

```
while true
```

*sinnlos kosmetische sachen berichtige*

----------

## Evildad

 *Necoro wrote:*   

> 
> 
> *sinnlos kosmetische sachen berichtige*

 

Dann musst aber schon das komplette Skript neu schreiben *fg*

Aber das ist schon sehr kreativ um ne Endlosschleife zu kreieren...

----------

## think4urs11

 *Evildad wrote:*   

> Aber das ist schon sehr kreativ um ne Endlosschleife zu kreieren...

 

Noch dazu weil sie wie oben erwähnt nicht mal einen kompletten Durchlauf schafft; von endlos wahrlich keine Spur  :Wink: 

----------

## Finswimmer

Sinn der Sache ist Folgendes:

Ich habe einen Rechner, der sich zu der Zeit, in der am wenigsten los ist (Montags um 4.00h morgens), anschaltet.

Per crontab laufen dann zwei rsyncs.

Da das, je nach Rsync auch über 5 Stunden laufen kann, und ich dann am Rechner arbeite (=eingeloggt bin), muss  ich das so überprüfen.

who 1> $datei ergibt nichts aus, von daher *sollte* auch kein User eingeloggt sein.

@Think:

Wie mache ich es denn dann (ohne while), dass immer alle 5 min überprüft wird, ob rsync/who aktiv ist?

Danke

Tobi

P.S.: OLEEEEEEEEEEE OLEEEEEEEEEEEEE OLEEEEEEEEEEEEE OLEEEEEEEEEEEEEE  :Very Happy:   :Very Happy: 

----------

## think4urs11

 *Finswimmer wrote:*   

> Wie mache ich es denn dann (ohne while), dass immer alle 5 min überprüft wird, ob rsync/who aktiv ist?

 

Den cronjob 'check-for-users-or-rsync.sh' alle 5 Minuten aufrufen?

Der Job läuft einmal durch und entweder passiert dann nichts (rsync läuft noch oder jemand ist angemeldet) oder die Maschine fährt runter.

5 Minuten später das gleiche Spiel von vorne.

----------

## rc

OT

was genau für einen Vorteil hat denn die Verwendung eines Cronjobs anstatt einer "while true .. sleep x .." Schleife zum regelmässigen Ausführen eines Skripts bzw. prüfen einer Bedingung usw.?

Ausser der Tatsache, dass man Cronjobs zentral verwalten kann.

Performance mässig sollte das doch kein großer Unterschied sein?

Schliesslich macht ein "sleep x" ja nichts anderes, als einen Prozess für die Zeit x in den "Sleep" Zustand zu versetzen.

Um den Rest kümmer sich ja der Scheduler.

Im Prinzip muss das ja bei einem Cron Deamon ähnlich laufen.

Und ob jetzt der Cron Deamon im sleep ist oder mein Skript oder Programm oder was auch immer ist ja an und für sich egal.

Gruß,

rc

----------

## tuam

Vorteile

- schon fertig programmiert

- für alle Unix-Admins verständlich

- kann leichter abgestellt oder verändert werden

- spart Ressourcen, wenn der cron eh läuft

FF,

Daniel

----------

## Finswimmer

 *Think4UrS11 wrote:*   

>  *Finswimmer wrote:*   Wie mache ich es denn dann (ohne while), dass immer alle 5 min überprüft wird, ob rsync/who aktiv ist? 
> 
> Den cronjob 'check-for-users-or-rsync.sh' alle 5 Minuten aufrufen?
> 
> Der Job läuft einmal durch und entweder passiert dann nichts (rsync läuft noch oder jemand ist angemeldet) oder die Maschine fährt runter.
> ...

 

Und am Mittwoch Morgen schalte ich das Ding ein, hole mir einen Kaffee, schwätze kurz (>5Minuten) und der Rechner ist wieder aus.

Daher kommt auch meine Idee, dass er nur von selbst ausgehen soll, wenn er zum Backup angegangen ist.

Leider mag crontab immer noch nicht.

Tobi

----------

## py-ro

Wenn der nur nach dem Backup ausgehen soll, warum packst du das nicht ans ende deines vermutlich vorhandenen Backup Scripts?

Py

----------

## Finswimmer

 *py-ro wrote:*   

> Wenn der nur nach dem Backup ausgehen soll, warum packst du das nicht ans ende deines vermutlich vorhandenen Backup Scripts?
> 
> Py

 

Weil es 2-3 Backups sind, und die, wie oben geschrieben, mitunter sehr lange dauern können, und dann arbeite ich an dem Rechner, und dann geht er mittags aus...  :Wink: 

Aber: Bei aller Liebe  :Wink: , die Frage war, warum das Runterfahren nicht klappt, nicht, warum ich das überhaupt mache.

Daher nochmal die Frage: Kann es sein, dass ein init/shutdown als root aus Crontab nicht erlaubt ist?

Danke

Tobi

----------

## sh0r7y

wie im 2 post schon mal geschrieben haste schon mal versucht den ganzen shutdown pfad einzugeben (/sbin/shutdown) ?

----------

## Anarcho

Und hast du schonmal ins syslog geschaut ob cron dort eventuelle Fehler gemeldet hat? Sonst, wie schon gesagt, absoluten Pfad verwenden (oder PATH Variable setzen).

EDIT:

Noch was, was sollen die zusätzlichen Parameter beim shutdown?

```
shutdown -h now  0 2>&1 /root/rsync/init-temp
```

Möchtest du den STDOUT umleiten? Und was soll dann die 0?

Also sollte es entweder

```
shutdown -h now
```

```
shutdown -h now  2>&1 > /root/rsync/init-temp
```

heissen.

Das gleiche gilt natürlich auch für den zweiten Aufruf, der den Rechner allerdings, sobald das ganze geht, immer sofort runterfährt, wie schon von Thinky beschrieben wurde. Der Aufruf muss also weg, dann sollte es auch mit der Endlosschleife gehen...

EDIT 2:

Statt shutdown kannst du natürlich auch "init 0" oder "halt" verwenden.

----------

## Finswimmer

Absoluter Pfad bringt leider auch nichts. 

In /var/log/messages steht auch nichts.

Ich wollte STDOUT und STDERR umleiten um so evtl Fehlernachrichten zu bekommen. Leider kommt da nichts an.

init 0 hatte ich schon getestet.

Ich bin immer noch ratlos.

Danke

Tobi

----------

## Anarcho

Hattest du denn jetzt die korrekte STDOUT Umleitung (siehe mein letzter Post) eingetragen? Sonst wird hier garnichts umgeleitet und daher ist auch kein init-temp da.

----------

## 69719

Schon mal in /var/log/crond/current geschaut? (bei Metalog)

```

shutdown -h now  0 2>&1 /root/rsync/init-temp 

```

da wolltest du wohl

```

shutdown -h now &>/root/rsync/init-temp

```

angeben, es sei denn du wolltest du stderr auf stdout unmleiten und shutdown mit den Parametern "-h now  0 /root/rsync/init-temp" aufrufen.Last edited by 69719 on Tue Jun 17, 2008 3:13 pm; edited 1 time in total

----------

## Bloodsurfer

 *Finswimmer wrote:*   

>  *py-ro wrote:*   Wenn der nur nach dem Backup ausgehen soll, warum packst du das nicht ans ende deines vermutlich vorhandenen Backup Scripts?
> 
> Py 
> 
> Weil es 2-3 Backups sind, und die, wie oben geschrieben, mitunter sehr lange dauern können, und dann arbeite ich an dem Rechner, und dann geht er mittags aus... 
> ...

 

Ohne lange nachbohren zu wollen, aber... am Ende des Scripts einmal who aufrufen, und wenn keiner eingeloggt ist Klappe zu? Wo ist das Problem?

----------

## NightDragon

Okay also folgendes:

- Das Script läuft am Montag morgen, und soll dort dann alle 5 min checken ob jemand eingelogt ist und oder ein rsync noch läuft.

   -- das geht mittels cron-job, dort kann man ja auch Wochentage spezifizieren

Und es kommt ja nicht drauf an das Script möglichst genial zu schreibenl, sondern eher übersichtlich.

Ich würd deine Sache eher so angehen:

```

#!/bin/bash

rsync_act=`ps aux|grep -i rsync|grep -vi grep|grep -vi ausschalten|wc -l`

user_act=`who|wc -l`

if ( [ "$rsync_act" -eq 0  ] && [ "$user_act" -eq 0 ] ); then

      shutdown -h now  2>>&1 /root/rsync/init-temp 

fi
```

Und das am Montag dann alle 5 min aufrufen

----------

## Evildad

 *Finswimmer wrote:*   

> 
> 
> Daher nochmal die Frage: Kann es sein, dass ein init/shutdown als root aus Crontab nicht erlaubt ist?
> 
> Danke
> ...

 

Kurze Antwort.

Es ist sehr wohl erlaubt, da es bei mir so funktioniert   :Very Happy: 

----------

## think4urs11

 *Finswimmer wrote:*   

> Und am Mittwoch Morgen schalte ich das Ding ein, hole mir einen Kaffee, schwätze kurz (>5Minuten) und der Rechner ist wieder aus.

 

Daran ändert aber dein while true do if foo shutdown else shutdown done auch nichts; 5 Minuten nach dem ersten Aufruf ist Schicht im Schacht (sobald der shutdown-Aufruf klappt jedenfalls)  :Wink: 

Abgesehen davon sagtest du das diese Jobs Montags laufen - was hindert dich daran diesen cronjob auch entsprechend nur am Montag alle 5 Minuten laufen zu lassen? Meinetwegen auch nur zwischen 4 und 13 Uhr.

Ein genaueres Pflichtenheft tut Not Hr. Kollege  :Wink: 

 *Finswimmer wrote:*   

> Daher nochmal die Frage: Kann es sein, dass ein init/shutdown als root aus Crontab nicht erlaubt ist?

 

Geht definitiv, ich hab das auf einer Box sogar direkt in der crontab für einen regular reboot, d.h. in /etc/crontab 

```
2 4 * * 6      root    /sbin/shutdown -r now
```

Zeig doch mal deine vollständige crontab, ggf. hängt da ja was im Argen

----------

