bash for

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ttyUSB0
Beiträge: 33
Registriert: 29.10.2005 14:49:07

bash for

Beitrag von ttyUSB0 » 17.03.2015 12:42:58

Hi Leute,

Starte ich das Script manuell, laufen die rsnapshot-Jobs seqentiell ab.
Startet der Cron-Job das Script werden alle rsnapshot-Jobs gestartet.
Wo ist das Problem ?

Code: Alles auswählen

#!/bin/bash

retain=$1

for conf in /vol/6/conf/*.conf; do
   /usr/bin/rsnapshot -c $conf $retain;
   sleep 10
done

Benutzeravatar
4A4B
Beiträge: 925
Registriert: 09.11.2011 11:19:55
Kontaktdaten:

Re: bash for

Beitrag von 4A4B » 17.03.2015 13:51:00

Wenn mit sequentiell gemeint ist, dass die 10 Sekunden Pause eingehalten werden, benötigt der Cronjob vielleicht noch den vollen Pfad von sleep:

Code: Alles auswählen

   /bin/sleep 10

ttyUSB0
Beiträge: 33
Registriert: 29.10.2005 14:49:07

Re: bash for

Beitrag von ttyUSB0 » 17.03.2015 14:17:10

Nein, wenn das Script von Cron gestartet wird dann, werden alle rsnapshot Konfigurationen zugleich gestartet.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash for

Beitrag von Meillo » 17.03.2015 14:35:52

Hat der Cronjob irgendwelche Ausgabe erzeugt? (Mail an root)

Ist das Verhalten gleich wenn du das Script mit `at now' startest?

Wie findest du heraus ob die rsnapshots gleichzeitig starten?

Wenn sie parallel starten, dann muss ja ein `&' am Befehlsende kommen. Vielleicht wird ja `&' als Parameter uebergeben. :P
(Quote mal deine Variablenexpansionen.)

Soviel mal an Raterei von mir. Von einem Problem dieser Art habe ich jedenfalls bisher noch nicht gehoert. (Das muss nichts heissen, aber ich wuerde trotzdem zuerst in deiner Konfiguration suchen.)
Use ed once in a while!

ttyUSB0
Beiträge: 33
Registriert: 29.10.2005 14:49:07

Re: bash for

Beitrag von ttyUSB0 » 17.03.2015 14:53:03

Hier noch ein Beispiel zum besser verstehen und nachvollziehen.

Script rs

Code: Alles auswählen

dd if=/dev/zero of=/vol/5/$1.dd count=1M bs=1k
Script rs_test ruft rs auf

Code: Alles auswählen

#!/bin/bash

for i in {1..5}; do
   /vol/5/rs $i;
done
Was passiert ist, dass mehrere dd's gleichzeitig gestartet werden und nicht einer nach dem anderen.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash for

Beitrag von Meillo » 17.03.2015 15:11:00

Mit folgendem Script konnte ich das Verhalten *nicht* reproduzieren:

Code: Alles auswählen

#!/bin/sh

for i in `seq 10` ; do
        date | mail -s "job $i" meillo
        sleep 20
done
(Ich hab sowohl mit htop(1) zugeschaut wie die Prozesse spawnen, als auch mit mail(1) zugesehen wie die Mails ankommen.)

Ich hab den Vixie Cron von Debian stable.
Use ed once in a while!

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: bash for

Beitrag von Cae » 18.03.2015 00:23:23

Ich wuerde ja fast annehmen, dass deine Shell die Schleifen aufrollt, um Performanceverbesserungen durch paralleles Verarbeiten zu erreichen. Das ist aber keineswegs der Standard und haeufig auch nicht hilfreich. Das duerfte eher kaputt sein, und zwar tiefer drinnen.

Was ergibt denn

Code: Alles auswählen

$ strace -ttfe execve,wait4,clone,brk /path/to/rs_test
fuer deinen dd-Test?

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
catdog2
Beiträge: 5352
Registriert: 24.06.2006 16:50:03
Lizenz eigener Beiträge: MIT Lizenz

Re: bash for

Beitrag von catdog2 » 18.03.2015 01:02:41

Mal ganz blöd gefragt: $1 enthält kein & oder ähnliches?

Mal

Code: Alles auswählen

#! /bin/bash -x
testen?
Ich wuerde ja fast annehmen, dass deine Shell die Schleifen aufrollt,
Na das glaub ich eher nicht…
Unix is user-friendly; it's just picky about who its friends are.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash for

Beitrag von Meillo » 18.03.2015 08:48:06

catdog2 hat geschrieben:Mal ganz blöd gefragt: $1 enthält kein & oder ähnliches?
Wenn der Fragende halt mal meinem Hinweis dazu nachgehen wuerde und die Variablenexpansionen quoten wuerde, dann koennten wir diesen Fall mal ausschliessen.

@ttyUSB0: Bislang hast du noch auf keinen unserer Vorschlaege *reagiert*.
Use ed once in a while!

ttyUSB0
Beiträge: 33
Registriert: 29.10.2005 14:49:07

Re: bash for

Beitrag von ttyUSB0 » 19.03.2015 11:48:15

An dem geposteten Beispiel ist es ersichtlich das ein & übergeben wird.

Habe den Fehler gefunden. Es war ein fehlerhafter Cron-Eintrag.

Code: Alles auswählen

*	*/6	*	*	*	script
Danke für die Hilfe.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash for

Beitrag von Meillo » 19.03.2015 12:20:30

Schoen, dass dein Problem geloest ist.
ttyUSB0 hat geschrieben: Habe den Fehler gefunden. Es war ein fehlerhafter Cron-Eintrag.

Code: Alles auswählen

*	*/6	*	*	*	script
Ist das der fehlerhafte oder der korrekte Eintrag? Was genau war der Fehler?


Ich faende es schoen, wenn hier im Forum nicht nur die Probleme geloest werden sondern auch die Problemursachen und die Loesungswege dokumentiert werden. Es gibt naemlich eine ganze Menge Mitleser, die lernen wollen. ;-)
Use ed once in a while!

ttyUSB0
Beiträge: 33
Registriert: 29.10.2005 14:49:07

Re: bash for

Beitrag von ttyUSB0 » 19.03.2015 13:28:54

Der richtige Eintrag damit alle 6 Stunden das Script ausgeführt wird.

Code: Alles auswählen

0	*/6	*	*	*	script

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash for

Beitrag von Meillo » 19.03.2015 13:54:25

Danke.


Heisst das dann, dass nicht dein Script mehrere Prozesse gleichzeitig gestartet hat sondern Cron dein Script jede Minute neu gestartet hat, dass also die parallelen Prozesse nicht von deinem Script sondern von Cron verursacht worden sind? Verstehe ich das so richtig?

Dann solle aber nur jede Minute ein neuer Prozess gestartet worden sein und nicht alle direkt hintereinander (wie es mit `&' passiert waere). Wenn du also sofort nach der Aktivierung die Prozesse angeschaut haettest, dann haettest du dort nur genau einen gesehen, eine Minute spaeter zwei (mit dem gleichen Argument!), und in der Art langsam steigend ... letztlich sogar mehr als die fuenf die dein Beispielscript gespawed haette.

Den Unterschied haette man auch im Prozessbaum sehen koennen. Wenn du uns veraten haettest, wie du nachschaust wieviele Prozesse gleichzeitig laufen, und diese Ausgabe gepostet haettest, dann haetten wir das dort vielleicht schon erkannt, oder dich zumindest auf sowas wie `ps axfw' hingewiesen ...


Es tut mir leid, dass ich hier so belehrend auftrete ... wobei, nein, eigentlich tut's mir nicht leid, denn ich belehre hier um der Forencommunity etwas Gutes zu tun. Versteh' das bitte als konstruktive Kritik (... wenn auch mein Tonfall viel von Ich-hab's-ja-gleich-gesagt hat). :roll:
Use ed once in a while!

ttyUSB0
Beiträge: 33
Registriert: 29.10.2005 14:49:07

Re: bash for

Beitrag von ttyUSB0 » 20.03.2015 09:49:13

Nein ich nehme es nicht persönlich, Menschen wie Dir kann es nicht recht genug machen.

Wenn Du mein Beispiel ausprobiert hättest und nicht ein eigenes gepostest, hättest Du gesehen A das kein & übergeben wird. Auch ist mir nicht klar wie Du von */6 auf 1 Minute kommst ?.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash for

Beitrag von Meillo » 21.03.2015 15:16:24

ttyUSB0 hat geschrieben: Menschen wie Dir kann es nicht recht genug machen.
Meist hat dieses Verhalten gute Gruende.
Wenn Du mein Beispiel ausprobiert hättest [...]
... dann haette ich das Problem auch nicht nachvollziehen koennen, da dein Script ebensowenig das Problem beinhaltet hat wie mein Script.

Der Deal ist doch dieser: Ich will etwas lernen und deshalb beschaeftige ich mich mit deinem Problem. Du willst dein Problem geloest haben und deshalb solltest du Personen wie mir das bieten was uns motiviert. ;-)

Auch ist mir nicht klar wie Du von */6 auf 1 Minute kommst ?.

Code: Alles auswählen

* */6 ...
... bedeutet: ``Jede Minute in jeder durch sechs teilbaren Stunde.'' ;-)
Use ed once in a while!

Antworten