Script Hilfe gesucht!!!

Status
Für weitere Antworten geschlossen.

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
13.803
Punkte für Reaktionen
3.761
Punkte
468
Es kommt halt drauf an, was dieses "AutoStartSickRage.sh" macht. Ist es ein Dauer- oder Langläufer, muss es wie beschrieben in den Hintergrund geschoben werden, sonst hält es den ganzen Bootvorgang auf.

Bitte keine Vollzitate - und erst recht nicht, wenn du dich auf einen Beitrag direkt darüber beziehst.
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
@Kalysto: Hast du mittlerweile schon ausprobiert was 'Benares' empfohlen hat? Damit das script aus dem Start/Stop script aufgerufen wird und im Hintergrund weiter läuft ein Ampersand "&" an den Befehl hinten dran hängen.

z.B. anhand von deiner Start Sequenz:

Rich (BBCode):
sh /volume1/01_public/Synology/Scripts/AutoStartSickRage.sh &

[...] und dieses quite zum beenden von dem Prozess habe ich bei wem anderes gesehen daher dachte ich das dies da rein muss ?? [...]
Willst du damit sagen dass das script in einer Endlosschleife läuft und so lange etwas tun soll bis das System wieder herunter fährt und erst beim shutdown beendet wird???

Und wo hast du dieses "quite" gesehen? Könntest du auf dies einmal als Verweis referenzieren?

Gruß
luddi
 
Zuletzt bearbeitet:

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
@ Benares ja ok werde ich mir merken für das nächste mal !

@luddi ja ihr hatte recht das war der Fehler ! und für mich noch mal dieses & bedeutet einfach nur das der ganze Prozess in den Hintergrund geschoben wird sodass der Boot Vorgang weiter geht ??
denn die .sh dabei von mir lässt eben ein Programm laufen und ist deshalb immer aktiv und mit dem & gehts nun ;)

danke euch beiden für eure Geduld ;)
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Ja gneau so ist es. Wenn du ein Befehl ausführst und ein "&" hinten anfügst dann wird der Prozess angestoßen und im Hintergrund abgearbeitet.
Hier nochmals eine Erklärung für das hinten angestellte Ampersand "&" What does ampersand mean at the end of a shell script line?

In deinem Falle war nämlich das Problem (wie sich hinterher herausgestellt hat), dass das Start script ein weiteres sh script aufrufst welches nie beendet wird. Somit wird auch das start script welches unter /usr/local/etc/rc.d/ liegt nie beendet werden und das verzögerte deinen Bootvorgang quasi bis ins Unendliche. Alle start scripte müssen abgeschlossen sein damit das System hochfährt.

Gruß
luddi
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
alles klar dann weis ich es nächste mal bescheid
vielen dank für deine Hilfe
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Danke auch an 'Benares' der den entscheidenden Hinweis geliefert hat die Ausführung des scripts in den Background legen zu müssen. Wusste ja niemand dass es sich bei dem script um einen Job handelt der ständig läuft und nicht beendet wird.

Gruß
ludd
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
13.803
Punkte für Reaktionen
3.761
Punkte
468
& bedeutet einfach nur das der ganze Prozess in den Hintergrund geschoben wird sodass der Boot Vorgang weiter geht ??
ja.

Probier es einfach mal aus, z.B. mit
Code:
(sleep 10; echo "fertig") &
auf der Konsole. Einmal mit und einmal ohne &. Mit & kommt der Prompt sofort wieder und du kannst weiterarbeiten. Nach 10s quasselt das Hintergrundscript dann einfach rein.
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
hey ich hätte da noch mal ne kleine frage .....

Rich (BBCode):
#!/bin/sh
case "$1" in
backup)
cd /volume1/01_public/SickRage
tar cfz /volume1/01_public/Synology/Backup_Indexer!/SickRage/Backup-"$(date +%d.%m.%Y.%H:%M:%S)".tar.gz config.ini sickbeard.db
;;
delete)
cd /volume1/01_public/Synology/Backup_Indexer!/SickRage/
if [ "$(ls /volume1/01_public/Synology/Backup_Indexer!/SickRage/ | wc -l)" -gt 5 ]; then
ls -t | sed -e '1, 5d' | xargs -d '\n' rm
fi
;;
listbackups)
echo "Folgende Backups sind derzeit verfuegbar "
ls -t /volume1/01_public/Synology/Backup_Indexer!/SickRage/
;;
savebackup)
$0 delete
cd /volume1/01_public/Synology/Backup_Indexer!/SickRage/
cp "$(ls -tr | sed -e '1, 4d')" /home/backups/sicherheitsbackup
;;
autobackup)
$0 backup
echo "Fehler"
;;
*)
echo "Falsche Benutzung, bitte wie folgt verwenden $0 (backup|delete|listbackups|savebackup)&q*uot";
exit 1
;;
esac
exit 0

ich hatte vor mir ein neues Backup Skript zu erstellen was bisher so aussieht nun habe ich das Problem das

Rich (BBCode):
if [ "$(ls /volume1/01_public/Synology/Backup_Indexer!/SickRage/ | wc -l)" -gt 5 ]; then
ls -t | sed -e '1, 5d' | xargs -d '\n' rm

dieser Befehl nicht so recht will den untern teil habe ich aus dem netzt
es soll eig nur soviel tun das wenn ich mehr als 5 backups habe die in Chronologischer Reihenfolge sortiert werden und demnach nur das 6ste backup gelöscht werden sollte ....
das ist aber der Output davon

Rich (BBCode):
DiskStation> sh TEST.sh delete
xargs: invalid option -- 'd'
sed: no address after comma
BusyBox v1.16.1 (2014-12-19 21:03:46 CST) multi-call binary.

Usage: xargs [OPTIONS] [PROG ARGS]

Run PROG on every item given by stdin

Options:
	-p	Ask user whether to run each command
	-r	Don't run command if input is empty
	-0	Input is separated by NUL characters
	-t	Print the command on stderr before execution
	-e[STR]	STR stops input processing
	-n N	Pass no more than N args to PROG
	-s N	Pass command line of no more than N bytes
	-x	Exit if size is exceeded

DiskStation>
nun weis ich nicht sorecht wie ich das abändern sollte damit das hin haut
denn ich weis auch nicht wie ich dies anders lösen sollte da ich dies nur gefunden habe ....

ich hoffe das ist okay wenn ich das hier dazu Poste

danke schon mal
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Hi,

wie so oft das Problem mit der built-in shell (ash) des Systems. Die ash bietet oft nicht den gleichen Umfang wie es eine andere bash tut. Somit muss man einen anderen Lösungsweg suchen der letzten Endes das gleiche bewirkt.

Mit ein wenig Recherche und Ausprobieren auf meinem eigenen System bin ich zu folgendem Ergebnis gekommen.

Du kannst exakt diese Befehlszeile für dein Vorhaben verwenden:
Quelle: stackoverflow.com: "Delete all but the most recent X files in bash"
Rich (BBCode):
(ls -t | head -n 5;ls) | sort | uniq -u | sed -e 's,.*,"&",g' | xargs rm

Gruß
luddi
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
na toll du findest es und ich habe nur welche gefunden die nicht gehen wo immer ein anderer Fehler kam .....
danke dir

noch etwas

Rich (BBCode):
autobackup)
$0 backup
echo "Fehler"

man konnte doch mit diesem $0 backup eine Verknüpfung auf das obige Backup) herstellen das habe ich auch so im netzt gefunden aber bei mir meint er er könnte die .sh nicht finden muss ich noch irgend wo diese Verknüpfung festlegen ??
denn bei den anderen ging es ja auch ....
ich komm da manchma net mit wieso es mal geht und dann etwas nicht geht!!!
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
keiner ne Idee ;) ?
oder habe ich mich bescheiden ausgedrückt ?
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Ich glaube schon zu wissen was du vor hast. Aber ein wenig Geduld wäre auch nicht schlecht bis jemand eine entsprechende Antwort weiß. Wenn du aber bash lernen möchtest kann ich dir empfehlen dich in anderen Foren umzuschauen, davon gibt es mehr als genug.

Aber nichts desto trotz möchte ich dich hier nicht sitzen lassen.
Du versuchst also das Script rekursiv aufzurufen (also sich selbst). Sobald es mit dem Übergabeparameter "autobackup" aufgerufen wurde, soll es sich selbst ein weiteres mal mit dem Parameter "backup" aufrufen.

Es müsste daran liegen dass der Dateipfad (bzw. die Datei) evtl. Sonderzeichen oder auch Leerzeichen enthält die "escaped" werden müssen.
Abhilfe dafür wäre z.B. den Aufruf $0 als String zu setzen "$0"
Rich (BBCode):
autobackup)
  "$0" backup

Versuche es einmal und gib einfach Bescheid was dabei heraus gekommen ist.

Gruß
luddi
 
Zuletzt bearbeitet:

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
okay tschuldige

also ich habe dies gemacht hat mir aber nicht den entsprechenden erfolg gebracht

Rich (BBCode):
DiskStation> sh TEST.sh autobackup
TEST.sh: line 210: TEST.sh: not found

DiskStation>

denn das $0 als echo funktioniert falls das irgend was aussagen tut

Rich (BBCode):
DiskStation> sh TEST.sh 
Falsche Benutzung, bitte wie folgt verwenden TEST.sh (autobackup|backup|delete|listbackups|savebackup)

dieses TEST.sh wird über das $0 angezeigt .......
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
dieses TEST.sh wird über das $0 angezeigt .......
Das soll ja auch so sein dass mit $0 die Datei selbst gemeint ist. Hier einmal eine kurze Erklärung warum das so ist.

Ein script bzw. tool (als binary) kann (wenn vorgesehen) mit Parametern aufgerufen werden. Der Aufbau ist wie folgt:

Rich (BBCode):
test.sh     PARAM_1     PARAM_2     [...]     PARAM_n

Will man den ersten Parameter im script auswerten (bzw. einlesen) dann verwendet man $1.
Somit lässt sich ableiten dass die folgenden Parameter mit $2 [...] $n eingelesen werden können.

Um das script selbst in sich aufzurufen (für eine rekursion) kann mit mit $0 darauf Zugreifen.
Wenn man in einem shell script auf die einzelnen Parameter zugreifen möchte ergibt sich folgendes Bild bzw. Zuordnung.

Rich (BBCode):
test.sh	PARAM_1	PARAM_2	[...]	PARAM_n
  $0      $1      $2               $n


Warum das bei dir nun nicht funktioniert kann ich dir im moment nicht sagen.

Was steht denn genau in der Zeile 210 die den Fehler meldet, wie machst du nun den Aufruf in der besagten Zeile damit dieser Fehler kommt?
Rich (BBCode):
TEST.sh: line 210: TEST.sh: not found

Gruß
luddi
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
also in der Line 210 steht einfach nur der case Abschluss also "esac"

aber was mir eben eingefallen ist oder aufgefallen ist ist das er TEST.sh not found schreibt is ja eig. klar das er es so nicht findet !!
wenn ich dann in dem Skript das hinzufüge :

Rich (BBCode):
autobackup)
sh $0 backup

dann findet er es weil er dann den sh befehlt hat!
habe ich da irgend ein Fehler eingebaut weil er bei mir das sh benötigt ?
 
Zuletzt bearbeitet:

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Das kommt ganz darauf an.
Wenn das script file ausgeführt werden soll dann muss man...

a.) den absoluten Pfad angeben
Rich (BBCode):
/volume1/foo/bar/scriptfile.sh

b.) den relativen Pfad d.h. wenn man sich in dem Verzeichnis befindet von wo aus man das script aufrufen möchte benötigt man ./
Das bedeutet dass in diesem Verzeichnis die Datei zu finden ist.
Rich (BBCode):
./scriptfile.sh

c.) alternativ zu b.) ist auch ein vorangestelltes 'sh' möglich um die Datei auszuführen. Denn der Befehl 'sh' wird von dem Verzeichnis aus ausgeführt worin man sich gerade befindet. Und da somit das Verzeichnis auch bekannt ist, wird auch die Datei von dem Befehl sh gefunden.
Rich (BBCode):
sh scriptfile.sh

Die Ursache dafür ist folgende:
Versucht man ein scriptfile bzw. eine binary ohne Angabe des Pfades (entweder absolut oder relativ) zu starten, sucht das System unter den bekannten Systempfaden. Die bekannten Pfade für das System sind in dem Parameter PATH abgelegt.

Du könntest dir den Inhalt von PATH anzeigen lassen mit:
Rich (BBCode):
echo $PATH
Wenn das scriptfile (in deinem konkreten Fall test.sh) nicht in einem der in PATH hinterlegten Pfade zu finden ist dann wird dieses auch nicht ausgeführt werden können. Genau aus diesem Grund muss man sich für eine der Möglichkeiten a.), b.) oder c.) entscheiden.

Es gäbe auch noch eine weitere Möglichkeit.
d.) Man erzeugt einen symbolischen link mit dem absoluten Pfad zu dem scriptfile. Der Link muss dann in einem der Systempfade angelegt werden. Somit wäre man auch in der Lage das scriptfile direkt ohne Umwege von jedem beliebigen Pfad des Systems aufzurufen.


Gruß
luddi
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
alles klar ich bedanke mich bei dir für die Hilfe und nun weis ich ja wies zu machen ist ;)
Danke!

noch eine kleine frage zu if

Code:
if [ -rwx "/volume1/01_public/
das nimmt er nicht an wie kann ich dies sonst noch schrieben -r -w -x geht auch nicht ich möchte damit überprüfen ob eine Datei ( existiert ) lesbar beschreibbar und ausführbar ist dazu die rwx Buchstaben oder kann man allgemein nur ein Bedingung an if knüpfen ?
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
30.694
Punkte für Reaktionen
2.105
Punkte
829
Hast Du es einmal mit UND-Verknüpfung (&&) probiert? Also:

Rich (BBCode):
if [ -r /volume1/01_public/ && -w /volume1/01_public/ && -x /volume1/01_public/ ]
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
alles klar ich bedanke mich bei dir für die Hilfe und nun weis ich ja wies zu machen ist ;)
Danke!
Gerne geschehen! ;)

noch eine kleine frage zu if
Und genau da ist dein Problem... du kommst vom Einem in das Nächste... In Post #32 habe ich bereits erwähnt dass du hier in diesem Forum sicher nicht glücklich wirst wenn du versucht bash zu verstehen. Man kann sicher einiges aufschnappen, ausprobieren und es in seiner Umgebung zum laufen bringen. Aber dennoch hat man es nicht verstanden weil die Grundlagen fehlen.
Verstehe mich bitte nicht falsch, denn ich möchte dir nicht sagen du dürftest hier keine Fragen diesbezüglich stellen. Deswegen der Hinweis dass es sicher andere Quellen gibt wo man dies erlernen kann.


So genug Weisheiten ausgeplaudert... und nun zu deinem aktuellen Problem :)

Ja du müsstest in der Tat jedes einzeln als Bedingung prüfen. Aber du könntest das in einer Zeile Zusammenfassen:

Rich (BBCode):
if [ -r "/volume1/01_public/..." ] && [ -w "/volume1/01_public/..." ] && [ -x "/volume1/01_public/..." ] && [ -e "/volume1/01_public/..." ]; then


Gruß
luddi
 

Kalysto

Benutzer
Mitglied seit
30. Dez 2014
Beiträge
384
Punkte für Reaktionen
10
Punkte
18
Besten dank ;)
so das wars ich danke euch beiden :D
nun is das Skript Perfekt
*FREU* ^^
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat