Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Linux Forum Linux-Web.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

04.06.2009, 22:20

[gelöst] Probl. mit versch. Shells

Hallo,

ich habe ein kleines, aber sehr verzwicktes Problem.

Per cron starte ich ein Shellskript:
/verzeichnis/skript1.sh 2>/ERROR/skript1.err

Dieses Skript (#!/bin/bash) führ nur eine kurze Überprüfung und einen Logeintrag aus und ruft danach ein weiteres Skript auf:

/verzeichnis2/skript2.sh & (Hintergrund bewusst)

Skript2:
#!/bin/bash
....
differenz=`expr $maximal - $aktuell`
differenzR=`expr 1024 - $aktuell`
....
printf "%'.11d" $variable1 (erwartet: 00.001.024)

exit 100 (zurück zu Skript1, dass den Returncode loggt und beendet)


Problem 1:

im geschilderten Ablauf funktionieren alle Skripte einwandfrei, mit Ausnahme von printf: die Formatoption ' für Tausenderpunkte wird nicht ausgeführt, es erscheint als Ausgabe printf "%'.11d" $variable1 (un-erwartet: 00001024)

Problem 2:
starte ich Skript 1 direkt von der Console (nicht via Cron), funktioniert die Ausgabe mit printf korrekt, aber dafür wird der Befehl expr nicht mehr ausgeführt:

expr: Argumente, die keine Zahlen sind
expr: Argumente, die keine Zahlen sind

Ich habe die gleichen Befehle in mehreren Skripten, die alle einwandfrei funktionieren (allerdings nicht per Cron gestartet werden oder kein weiteres Skript aufrufen).
Nur bei dieser Konstellation nicht.
Aus meiner Sicht kann es nur an den Shells liegen, aber hier habe ich alle möglichen Kombinationen ausprobiert und die einzelnen Skripte in verschiedenen Shells ablaufen lassen (alle möglichen Kombinationen aus bash,sh,ksh).

Kann mir jemand einen Tipp geben, was ich a) falsch mache oder b) wie ich den gewünschten Effekt mit printf und expr hinbekomme ?

Vielen Dank.
Mike

PS: Forum, man und auch zwei Bücher haben mich leider nicht weiter gebracht.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MIKE bt« (04.06.2009, 22:22)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

2

05.06.2009, 00:04

RE: Probl. mit versch. Shells

die scripte werden durch cron in einer nichtinteraktiven shell gestartet, dadurch sind die umgebungsvariablen der shell anders gesetzt, als bei einer interaktiven usershell und damit reagiert sie auch anders.
auch die suchpfade sind nicht gesetzt, denn es wird keine profile-datei, bashrc etc abgearbeitet. wenn du kommandos ohne vollständigen pfad verwendest, dann kann die shell die kommandos entweder nicht ausführen oder sie benutzt interne kommandos mit dem selben namen, die reagieren aber zt anders.
darin sehe ich den hauptsächlichen grund für die probleme mit deinem script. das geht von echo über printf usw usf, die es als externe und interne kommandos in diversen shells gibt und in der interaktiven shell verwendet man durch die eingestellten suchpfade und shelloptionen oftmals die externen kommandos. in cron-scripten bleiben der shell dann nur die internen kommandos wenn die pfade fehlen. die scripte reagieren dann meist anders oder funktionieren überhaupt nicht.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

3

05.06.2009, 00:13

Danke für die Antwort.

Was ich nicht ganz verstehe, ist:
Skripte (/bin/bash), die ebenfalls durch Cron aufgerufen werden, alelrdings keine weiteren Skripte aufrufen, beinhalten die gleichen Befehle (speziell: expr und printf).
In diesen Skripten funktionieren diese einwandfrei.

Ich hatte auch versucht, im Cronaufruf eine shell mit anzugeben (sh skript.sh), brachte aber im genannten Skript die gleichen Probleme.

Im fraglichen Skript habe ich anstelle von printf auch schon den kompletten Pfad /usr/bin/printf verwendet, mit gleichem Ergebnis.

Aber wie kann ich das Problem jetzt lösen / umgehen ?
Der Start via Cron ist unausweichlich

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

4

05.06.2009, 00:28

schau ich mir heute abend mal genauer an. jetzt muss ich erst mal inst bett, muss früh raus.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

5

05.06.2009, 01:03

Suuper, vielen Dank.

6

05.06.2009, 16:50

Ich habe meine ganzen Skripte nochmal geprüft (bzw. deren Ergebnisse):

die printf-Formatierung mit Tausenderpunkt funktioniert bei anderen Skripten, die per Cron aufgerufen werden, ebenfalls nicht.

Dort ist es bisher nicht aufgefallen, da 99% aller Ergebnisse <1000 sind, somit optisch nicht sofort aufgefallen.

Bei Skripten, die ohne Cron gestartet werden, funktioniert die Tausenderformatierung.

Allerdings nützt mir die Erkenntnis nichts - da syntaktisch alle Skripte/Befehle korrekt sind, benötigt man wahrscheinlich wesentlich mehr Backgroundwissen, als ich besitze, um auf einen Lösungsansatz zu kommen.

Die einzige Abhilfe die mir eingefallen ist:
a) das Programm nach wie vor via Cron starten
b) dort allerdings nicht das eigentliche Skript aufrufen, sondern nur einen Status erzeugen lassen (z.B. bestimmte Datei in bestimmen Verzeichnis)
c) das eigentliche Skript permanent im Hintergrund aktiv halten (mit sleep und Prüfung auf diese neu erzeugte Datei)

das würde funktionieren !
Allerdings betrifft es insgesamt 9 Skripte, die dann permanent im Hintergrund aktiv sind, was ggf. ja auch Ressourcenprobleme bringen kann.
Ausserdem ist es nur eine Halbherzige "Bypass"-Lösung :-(

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

7

05.06.2009, 21:06

sehr interessant.
also das problem ist die spracheinstellung. durch die environmentvariable $LANG erfährt die shell die spracheinstellungen, in der cronshell ist die variable leer und damit ist kein tausendertrennzeichen verfügbar und wird nicht gedruckt.
setz mal in das script zb
export LANG=en_US
vor die erste printf-anweisung und schau, was passiert.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

8

05.06.2009, 21:23

Hallo,
das hatte ich schon versucht.

Ich habe

- in dem 2. Skript LANG="de_DE", export LANG eingefügt
Ergebnis: printf mit gleichem Ergebnis, die expr-Funktionen wurden fehlerhaft

- dto. im 1. Skript,
Ergebnis: printf geht nicht mit Tausenderpunkt, expr geht

kann es sein, dass TERM da irgendeine Rolle spielt ?

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

9

05.06.2009, 21:32

kannst du die beiden scripte mal komplett posten, am besten als dateianhänge und nicht im text.

und probier es mal bitte mit en_US, das wird auf jeden fall durch die shell gefunden.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »linuxerr« (05.06.2009, 21:44)


10

05.06.2009, 23:16

Hallo,

en_US bringt gleiches Ergebnis, natürlich zusätzlich einige Fehler, da einige Werte in der Verarbeitung schon vorformatiert wurden auf de_DE (Dezimaltrenner).
Aber dieser Fehler ist klar.

Hinsichtlich printf und expr ergibt sich gleiches Verhalten.

Anbei die beiden Skripte.

Cron startet s1.sh, dieses - situationsbedingt - p660.sh
»MIKE bt« hat folgende Dateien angehängt:
  • p660.sh (2,28 kB - 21 mal heruntergeladen - zuletzt: 03.02.2011, 14:27)
  • s1.sh (1,04 kB - 16 mal heruntergeladen - zuletzt: 03.02.2011, 14:27)

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

11

06.06.2009, 08:50

hallo,
ich glaube wir sind einen schritt weiter.
deine scripte laufen bei mir überhaupt nicht und die shell bricht schon bei der zeile
#!/bin/bash
bash-3.1# ./s1.sh
bash: ./s1.sh: /bin/bash^M: bad interpreter: No such file or directory

ab, denn deine scripte sind voller dos-zeilenumbrüche \r\n
und das führt ,abhängig von der shell und deren version, an verschiedenen stellen unweigerlich zu extremen problemen.
ich würde an deiner stelle den editor wechseln (auf keinen fall ein windowsteil oder die zeilenumbrüche nachträglich entfernen zb mit dos2unix.
ich bin erstaunt, dass deine scripte im terminal überhaupt laufen.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

12

06.06.2009, 09:23

Hallo,

hmm ... ich erstelle alle Scripte mit WinSCP.
Das Problem kommt wahrscheinlich daher, dass ich sie nach dem Download noch geändert habe und dann ins Forum gepostet habe.
Die Änderungen erfolgten auf WIN-Ebene.

Ich versuche es nochmal - beide Files direkt vom Server als *.gz.
»MIKE bt« hat folgende Datei angehängt:

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

13

06.06.2009, 10:06

so,
die zeilenumbrüche sind korrekt, in p660.sh sind die formatstrings verkehrt . und d fehlen.
expr gibt fehlermeldungen aus, wenn eine der variablen nur mit einem leerstring gefüllt ist. defaultwerte setzen ist sicherlich sinnvoll.

mit dem lang eintrag funktionierts bestens, ab tausenderbeträgen wird abgetrennt.
lass die doch von scripten die im cron laufen die fehlermeldungen anzeigen.
starte die scripte dazu in einer subshell und schick die fehlermeldungen in ein logfile oder an logger.
zb so
s0.sh

Quellcode

1
2
3
4
#!/bin/bash
(
/bin/bash -x /modchart/system/s1.sh 1 
) 2>&1 | logger


und s0.sh bindest du in cron ein. in der systemlog bekommst du dann die fehlermeldungen.
es ist auch sinnvoll, wenn printf probleme macht, ein strace davorzusetzen und dann kannst du das script auf konsole und in cron laufen lassen und siehst, was anders läuft.

noch eine bemerkung, die master.CONF liegt in einem verzeichnis /moddata/p600 und nicht p660 ?? ich kenn ja die bedeutung nicht, kam mir aber komisch vor.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

14

07.06.2009, 06:03

Hallo,
die p600 ist schon korrekt, es gibt neben p660 auch noch p610..p690, somit ist das alles unter dem Modul p600 vereinigt und dementsprechend dort die Master-Conf.

Ich habe jetzt die Skripte über Subshell und Debug laufen lassen.
An den Fehler/Problemen hat sich natürlich dadurch nichts geändert, aber ich bin dann auf einen Lösungsansatz gekommen, nachdem ich das x-te mal die ganzen man-Pages durchgeackert habe.

Die LANG ist systemweit nicht einheitlich, auch dort nicht, wo diese explizit definiert+exportiert wird.
Und zwar hängt die LANG und auch die LOCALE vom jeweiligen Benutzer ab. Da die Skripte nicht einheitlich immer unter dem gleichen User laufen (root, andere dedizierte User dafür), kamen somit sonderbare Probleme zustande.

Ich habe jetzt am System noch mal die ganzen de_DE installiert und die conf-Dateien geprüft. Die /bash hatte immer andere LANG-Settings als die csh.
Jetzt sind die Ausgaben aller Skripte einheitlich, es wird - ohne explizites definieren+exportieren - immer die de_DE gezogen.

Eventuell ist da am System beim Aufsetzen was falsch gelaufen, ich habe das nicht selbst gemacht, somit habe ich auch keine Ahnung, wie die Installation vom Provider durchgeführt wurde.

Jetzt habe ich generell ein Problem, dass viele expr nicht mehr funktionieren, weil in den meisten Fällen die Zahlen vorformatiert kommen und somit ein falscher Dezimaltrenner für expr nun vorhanden ist.
Das muss ich jetzt in allen Skripten anpassen, aber gut - ist ein einmaliger Aufwand.

Was ich jetzt noch bemerkt habe, ist ein sonderbares Verhalten von printf:

printf "%'.8d" $variable bringt folgende Ergebnisse:

18 => 00000.018 ???? kein Punkt in den aufgefüllten Nullen
723 => 00000.723 ???? dto
1415 => 00001.415 ???? dto
1234567 => 01.234.567 ok

printf "%'8d" $variable bringt folgende Ergebnisse:

18 => 18 ok
723 =>723 ok
1415 => 1.415 ok
1234567 => 1.234.567 ok
12345678901 => 12345.678.901 ????? hier sollte nach der 2 auch ein Punkt sein
(kommt immer dann vor, wenn die Zahl > als die angegebene Formatweite ist).

Da es in den man-Pages und auch sonst im Netz nahezu keine Infos über das ' für Tausendertrennung gibt, weiss ist somit auch nicht, ob das Verhalten evtl. normal ist.

Jedenfalls tausend Dank an linuxerr, Dein Lösungsansatz hat mich auf die richtige Spur gebracht. Vielen Dank für die Geduld und Hilfe.

Manchmal frage ich mich, ob 1 Leben überhaupt ausreicht, Linux "richtig" zu beherrschen - aber ich bleibe dran :-)

Mike

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MIKE bt« (07.06.2009, 06:03)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

15

07.06.2009, 13:44

Zitat

Original von MIKE bt
Was ich jetzt noch bemerkt habe, ist ein sonderbares Verhalten von printf:

printf "%'.8d" $variable bringt folgende Ergebnisse:

18 => 00000.018 ???? kein Punkt in den aufgefüllten Nullen
723 => 00000.723 ???? dto
1415 => 00001.415 ???? dto
1234567 => 01.234.567 ok

printf "%'8d" $variable bringt folgende Ergebnisse:

18 => 18 ok
723 =>723 ok
1415 => 1.415 ok
1234567 => 1.234.567 ok
12345678901 => 12345.678.901 ????? hier sollte nach der 2 auch ein Punkt sein
(kommt immer dann vor, wenn die Zahl > als die angegebene Formatweite ist).

Da es in den man-Pages und auch sonst im Netz nahezu keine Infos über das ' für Tausendertrennung gibt, weiss ist somit auch nicht, ob das Verhalten evtl. normal ist.

ja, das ist wirklich eigenartig. auch man 3 printf schweigt sich über ein solches verhalten aus. erhebt sich die frage, welche version der coreutils du auf der maschine hast??????

Zitat

Jedenfalls tausend Dank an linuxerr, Dein Lösungsansatz hat mich auf die richtige Spur gebracht. Vielen Dank für die Geduld und Hilfe.

gern geschehen :)

Zitat


Manchmal frage ich mich, ob 1 Leben überhaupt ausreicht, Linux "richtig" zu beherrschen

bloß nicht, denn was soll man danach machen, wenn man alles kann ????? :crazy:
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »linuxerr« (07.06.2009, 13:45)


16

07.06.2009, 16:21

Warnung: Es gibt ein bash-builtin für printf! Bei anderen Shells könnte das auch vorhanden sein.

17

07.06.2009, 16:30

SuSe 10.1 Coreutils 5.93
Bash 3.1.17.1

Kein Unterschied im Script bei printf und /usr/bin/printf.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

18

07.06.2009, 16:53

ich habe es mit coreutils-6.9 und 5.0 probiert, bei LANG=en_US funktioniert der tausenderpunkt bei printf "%'6d" 18000000000 korrekt.
root@cgi1:~# printf "%'6d" 18000000000
18,000,000,000root@cgi1:~#

und mit LANG=de_DE ebenfalls
root@cgi1:~# printf "%'6d" 18000000000
18.000.000.000root@cgi1:~#

die ursache für das eigenartige verhalten von printf muss also woanders liegen.
hmmmm
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

19

07.06.2009, 22:24

und wenn Du

printf "%'.8d" 1234 versuchst ?

kommt dann
de_DE 00.001.234 oder 00001.234
en_US 00,001,234 oder 00001,234 ?

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

20

07.06.2009, 22:42

bei de 00.001.234 und bei us 00,001,234 wie zu erwarten. habe ich in einer suse10.1 standardinstallation ausprobiert und klappt ebenfalls.
irgendwas ist da faul an deinem system.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

Thema bewerten