Script mit Crontab ausführen - Script bricht in der ersten Schleife ab

Alonso42

Newbie
Registriert
Dez. 2019
Beiträge
3
Hallo Zusammen,

ich habe mir eine kleine Webseite gebaut und möchte jetzt gerne mit einem Shell Script eine Datei bearbeiten. Wenn ich das Script händisch anstoße funktioniert das auch sehr gut - Leider funktioniert nur der Cron Job dazu nicht komplett

also die Webseite liegt in /var/www/html/
dort gibt es einen ping.sh und eine switche.txt

root@ubuntu1804-lts-server:/var/www/html# ls -l
total 384
-rw-r--r-- 1 admin-rep admin-rep 585 Dec 18 09:53 index.php
-rw-r--r-- 1 root root 2105 Dec 19 14:22 ping.log
-rwxrwxrwx 1 root root 1264 Dec 19 14:22 ping.sh
-rw-r--r-- 1 root root 220 Dec 19 13:53 switche.txt

in der Ping.sh steht folgendes:

Code:
echo "Ping läuft">>/var/www/html/ping.log;

rm -f /var/www/html/aktualisierung_switche.txt
echo "oben: "`date +%d.%m.%Y_%H:%M`": "$?>>/var/www/html/ping.log;
echo "diese Zeile läuft noch mit in das Log">>/var/www/html/ping.log;


for i in $(cat /var/www/html/switche.txt); do

 echo "diese Zeile landet schon nicht mehr im log ">>/var/www/html/ping.log;
 IFS=';' read -ra array <<< "$i"
 h=0
 neuer_string=""
 for j in "${array[@]}"
  do
   h=$(($h+1))
   if (("$h"==1));
   then
    neuer_string=$j;
   fi;

   if (("$h"==2));
   then
    ip=$j;
    neuer_string=$neuer_string";"$j
   fi;

   if (("$h"==3));
   then
    neuer_string=$neuer_string";"$j
   fi;

   if (("$h"==4));
   then
    neuer_string=$neuer_string";"$j
   fi;

   if (("$h"==5));
   then
    if ping -c 1 -w 1 $ip >/dev/null; then
     neuer_string=$neuer_string";"`date +%d.%m.%Y_%H:%M`
    else
     neuer_string=$neuer_string";"$j
    fi;
   fi;
 done
#echo $neuer_string;
echo $neuer_string >>/var/www/html/aktualisierung_switche.txt;
echo "schleife: "`date +%d.%m.%Y_%H:%M`": "$?>>/var/www/html/ping.log;

done;
mv /var/www/html/aktualisierung_switche.txt /var/www/html/switche.txt
echo "unten: "`date +%d.%m.%Y_%H:%M`": "$?>>/var/www/html/ping.log;

das ist der Crontab:

root@ubuntu1804-lts-server:/var/www/html# crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
*/1 * * * * /var/www/html/ping.sh

Zum testen führt Cron das Script jetzt jede Minute aus:

root@ubuntu1804-lts-server:/var/www/html# grep -i cron /var/log/syslog
...
...
...
Dec 19 14:21:01 ubuntu1804-lts-server CRON[2286]: (root) CMD (/var/www/html/ping.sh)
Dec 19 14:21:01 ubuntu1804-lts-server CRON[2285]: (CRON) info (No MTA installed, discarding output)
Dec 19 14:22:01 ubuntu1804-lts-server CRON[2291]: (root) CMD (/var/www/html/ping.sh)
Dec 19 14:22:01 ubuntu1804-lts-server CRON[2290]: (CRON) info (No MTA installed, discarding output)
Dec 19 14:23:01 ubuntu1804-lts-server CRON[2297]: (root) CMD (/var/www/html/ping.sh)
Dec 19 14:23:01 ubuntu1804-lts-server CRON[2296]: (CRON) info (No MTA installed, discarding output)
Dec 19 14:24:01 ubuntu1804-lts-server CRON[2303]: (root) CMD (/var/www/html/ping.sh)
Dec 19 14:24:01 ubuntu1804-lts-server CRON[2301]: (CRON) info (No MTA installed, discarding output)
Dec 19 14:24:35 ubuntu1804-lts-server crontab[2307]: (root) LIST (root)
Dec 19 14:25:01 ubuntu1804-lts-server CRON[2309]: (root) CMD (/var/www/html/ping.sh)
Dec 19 14:25:01 ubuntu1804-lts-server CRON[2308]: (CRON) info (No MTA installed, discarding output)


Leider bekomme ich aber die for schleife im ping.sh nicht von cron ausgeführt. Alles davor funktioniert und händisch funktioniert alles. Deswegen vermute ich das bei dem "cat /var/www/html/switche.txt" ein Fehler auftritt der mir mein Script abbricht. Wie kann ich das Loggen um zu sehen was da los ist? Oder besser noch was mach ich falsch :D
Wie kann ich so einen fehler abfangen.
 
Also als erstes fällt mir da auf das es ein Skript im Kontext von root ist, dass für others schreibbar ist und in einem WWW Folder liegt :o
Das macht man nichtmal zum Spaß
 
Guck mal wo dein sh-Binary rumliegt und führe es so aus:

/pfad_zur_Binary /pfad_zum_Skript

Beispiel:

1/* * * * * /usr/bin/sh /var/www/html/ping.sh

Kann helfen, muss nicht.
Abgesehen davon: Linux Rechtekonzept. Da unbedingt einlesen. Sollte dein Server jemals gekapert werden hats der Hacker echt leicht.
 
  • Gefällt mir
Reaktionen: Alonso42
das hatte ich gemacht weil ich dachte es könnte an den rechten liegen

hab ich geändert - fehler bleibt aber der gleiche
-rwxr----- 1 root root 1264 Dec 19 14:22 ping.sh

cron läuft als user root und die datei gehört root. Kann es trotzdem sein das die Rechte für cat fehlen? Braucht man dafür nicht nur lese rechte?
Dec 19 15:20:01 ubuntu1804-lts-server CRON[2309]: (root) CMD (/var/www/html/ping.sh)

@axl foli
Danke - hat aber leider auch nicht geholfen - Das Script wird wieder nur bis zur For schleife ausgeführt
 
Na dann schreib mal den Inhalt der Switch TXT ins. Log, plus via 2> den stderr Stream auch irgendwohin.

in var/www gehört das natürlich alles nicht.
 
Dein Skript sollte vielleicht etwas aufgeräumter und POSIX konformer sein.

  • Shebang#!/bin/sh
  • Bashism mit Backticks durch $(date ...) ersetzen
  • Warum $? bei echo aufruf - ich glaub das macht doch gar nix (per default Rückgabewert des vorherigen Programms) -> weglassen
  • Semikolon am echo Ende wird doch nicht gebraucht

Solch ein vereinfachtes Skript läuft ohne Probleme mit innerer Schleife (nur mit einem echo in der FOR cat schleife , ohne innere FOR schleife).
Ansonsten sieht man dem Skript nicht unbedingt an, was es tut.

Das mit dem READ und den Feldern / array würde doch auch gehen mit Umgebungsvariablen und import via source und/oder stackoverflow variablen mit dynamischen Namen edit: oder awk - das ist für "feldmanipulationen" gemacht
 
Alonso42 schrieb:
Dec 19 14:25:01 ubuntu1804-lts-server CRON[2309]: (root) CMD (/var/www/html/ping.sh)
Dec 19 14:25:01 ubuntu1804-lts-server CRON[2308]: (CRON) info (No MTA installed, discarding output)
...
Wie kann ich das Loggen um zu sehen was da los ist?
MTA = Mail Transfer Agent. Ins deutsche übersetzt sagt dir cron via syslog:
"Dein Skript produziert Output auf stdout und/oder stderr. Das ist sicherlich nicht gewollt. Es handelt sich wahrscheinlich um Fehlermeldungen deines Skripts. Ich würde dir gern den Output deines kaputten Skripts, also die auftretenden Fehlermeldungen, per Mail zuschicken. Da du Held aber kein lokal funktionierendes Mailsystem eingerichtet hast, schmeiße ich diese Informationen in die Tonne. Sieh zu wie du zurecht kommst! Ich habe versucht dir zu helfen."

Wie wäre es, cron die Möglichkeit zu geben, dir (also dem Nutzer 'root', in dessen Namen cron das Skript abarbeitet) Mails zuzusenden? Dann könntest du die Fehlermeldungen gescheiterter Kommandos nachlesen statt nur wild zu spekulieren.

Ja, es geht auch anders. Aber das ist der klassische Weg.
 
Zuletzt bearbeitet:
Das war die Lösung :) Danke @lokon
#!/bin/bash

ich habe Händisch das Script per Bash ausgeführt. Cron nutzt wohl dash dafür. Das ist aber eine andere Syntax an dieser stelle:
IFS=';' read -ra array <<< "$i"

Jetzt wo im script steht das bash benutzt werden soll arbeiten Cron genau so wie es soll. Allerdings wäre dash performanter
 
Bashscript Debugging:
set -x exec &> /tmp/debug.txt
'set -x' - print every command
'exec &>' - redirect to file
 
Zurück
Oben