[Problem] cat Ausgabe per crontab in Datei umleiten funktioniert nicht wie gewünscht

EisbärBrhv

Neuer User
Mitglied seit
31 Dez 2009
Beiträge
8
Punkte für Reaktionen
0
Punkte
0
Hallo Leute,

ich habe das Problem, dass der folgende crontab Eintrag nur in der ersten Minute wie gewünscht funktioniert:

* 17-18 * * * cat /dev/ttyUSB0 >> /var/media/ftp/Dokumente/easy_$(date +%Y-%m-%d).txt

In der Konsole funktionierte die cat Ausgabe korrekt. Mit crontab wird nach genau 1 Minute ein neuer Prozess gestartet (zweite PID). Die Daten der ersten Minute werden in der Datei gespeichert und weitere Eingaben werden nicht mehr vorgenommen. Ich möchte aber 1 Stunde mitschreiben. Jeden Tag soll eine neue Datei erstellt werden.

Ohne eine Zeiteingrenzung in crontab (hier 17-18 Uhr) habe ich auch kein anderes Ergebnis erzielt.

syslog:

Aug 30 18:57:01 fritz cron.info crond[1912]: crond: USER root pid 7762 cmd cat /dev/ttyUSB0 >> /var/media/ftp/Dokumente/easy_$(date +%Y-%m-%d).txt
Aug 30 18:57:09 fritz kern.info kernel: /proc/tffs: info request: success
Aug 30 18:58:01 fritz cron.info crond[1912]: crond: USER root pid 7909 cmd cat /dev/ttyUSB0 >> /var/media/ftp/Dokumente/easy_$(date +%Y-%m-%d).txt
Aug 30 18:59:01 fritz cron.info crond[1912]: crond: user root: process already running: cat /dev/ttyUSB0 >> /var/media/ftp/Dokumente/easy_$(date +%Y-%m-%d).txt

top:
PID PPID USER

7762 1912 root S 1364 1% 0% /bin/sh -c cat /dev/ttyUSB0 >> /var/media/ftp/Dokumente/easy_$(date +%Y-%m-%d).txt
7909 1912 root S 1364 1% 0% /bin/sh -c cat /dev/ttyUSB0 >> /var/media/ftp/Dokumente/easy_$(date +%Y-%m-%d).txt

Was mache ich falsch?
 
Du versuchst, jede Minute einen neuen Prozess zu starten, ohne dass der alte beendet wird. Anscheinend fängt cron das ab, sonst hättest Du bald tausende von Prozessen laufen, oder wahrscheinlicher wäre ein Neustart der Box.
 
Kannst Du mir einen Tipp geben, wie ich den Prozess so starte, dass er die Ausgabe von /dev/ttyUSB0 für eine Stunde mitschneidet und sich anschließend beendet (ohne weitere Prozesse zu starten)?
 
Du kannst es damit versuchen:
Code:
(sleep 3600; kill $$) &
exec cat /dev/ttyUSB0 >> /var/media/ftp/Dokumente/easy_$(date +%Y-%m-%d).txt
 
Vielen Dank! ich habe jetzt eine Ergebnisdatei. Für den Test habe ich den Code wie folgt geändert und in crontab eingetragen:

* 21-22 * * * (sleep 360; kill $$) & exec cat /dev/ttyUSB0 >> /var/media/ftp/Dokumente/easymeter_$(date +%Y-%m-%d).txt

Folgendes ist mir noch aufgefallen. Unter top war zu beobachten, dass mit der Zeit bis zu 4 Prozesse ausgeführt wurden (In Übereinstimmung mit syslog). Die Datei wurde um 22.03 Uhr zuletzt geänder.

Das Ergebnis hilft mir aber auch so weiter. Danke!
 
Mach ein Shell-Script, in dem du die cat Anweisung aktivierst und im Hintergrund laufen lässt (also & am Ende).
Speicher die PID für den Prozess und starte dieses Script um 17 Uhr.
Um 18 Uhr killst du einfach den Prozess mit dieser PID per cronjob.
Fertig und simple... keine Probleme mit Cron.
 
Der Job wird ja auch jede Minute gestartet, aber erst nach 6 Minuten (360 Sekunden) gestoppt.

Mir ist im Moment nichht klar, an welcher Stelle ich das so beauftragt habe. Ziel ist ja 1 x starten, Ausgabedatei für den genannten Zeitraum füllen und Prozess beenden. Gibt es dafür auch eine Lösung?
 
Mir ist im Moment nichht klar, an welcher Stelle ich das so beauftragt habe (360 Sekunden).
Mit "sleep 360"
Ziel ist ja 1 x starten, Ausgabedatei für den genannten Zeitraum füllen und Prozess beenden. Gibt es dafür auch eine Lösung?
Für welchen Teil der Frage? Was das starten betrifft, siehe man cron.
Was das Stoppen betrifft, ich hatte oben 3600 (= 60 Minuten = 1 Stunde) geschrieben und nicht 360 (= 6 Minuten).
 

Den Teil hatte ich soweit verstanden und zu Testzwecken auf 360 geändert.

Was mir nach Durchsicht verschiedener Beispiele (im Internet) zum Starten von crontab nicht klar ist, ist der Teil 1 der Frage. An welcher Stelle habe ich beauftragt jede Minute einen neuen Prozess zu starten? Nur ein Prozess für den gesamten Zeitraum würde ja mein Problem lösen. Das Handbuch (man cron) habe ich eben nur gesichtet. Wird wohl ein wenig länger dauern die Erklärung für mein Problem da rauszulesen. Aber Danke für den Tipp.

Evtl. hilft noch der Hinweis, das der Prozess den Stromzähler für meine Photovoltaik Anlage auslesen soll, was ja per Hand über die Konsole auch korrekt funktioniert. Zielvorstellung ist also 1 Prozess ab 8 Uhr für 12 Stunden laufen zu lassen (ohne "Prozessinflation").
 
Was mir nach Durchsicht verschiedener Beispiele (im Internet) zum Starten von crontab nicht klar ist, ist der Teil 1 der Frage. An welcher Stelle habe ich beauftragt jede Minute einen neuen Prozess zu starten?
Manchmal ist die Beschreibung besser als Beispiele.
The time and date fields are:

field allowed values
----- --------------
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sunday, or use names)

A field may contain an asterisk (*), which always stands for "first-last".
Der Stern in der ersten Spalte bedeutet also jede Minute.
Evtl. hilft noch der Hinweis, das der Prozess den Stromzähler für meine Photovoltaik Anlage auslesen soll, was ja per Hand über die Konsole auch korrekt funktioniert. Zielvorstellung ist also 1 Prozess ab 8 Uhr für 12 Stunden laufen zu lassen (ohne "Prozessinflation").
Starte den Prozess um 1 Uhr und lasse ihn 20 Stunden laufen. Das deckt mit Sicherheit die komplette Zeit ab, auch im Hochsommer, und lässt mit 2 Stunden Pause mehr als genug Zeit für den Neustart.
 
Ganz ehrlich, ich verstehe nicht so ganz, warum ihr es euch so umständlich macht?
Dafür ist doch Cron da! 17 Uhr Prozess starten und um 18 Uhr killen. Was ist da jetzt so schwer dran?

Cron-Eintrag:

Code:
0 17 * * * root /root/bin/meinscript         # hier wird im script der Prozess gestartet und die PID gespeichert
0 18 * * * root kill $(cat /root/temp/meinscript.pid)

Bzw. den Eintrag "root" kann man sich sparen, wenn man es mit "crontab -e" als root anlegt.

/root/bin/meinscript
Code:
#!/bin/sh

cat /dev/ttyUSB0 >> /var/media/ftp/Dokumente/easy_$(date +%Y-%m-%d).txt &
echo "$?" > /root/temp/meinscript.pid

Dann noch ausführbar machen...
Code:
chmod 755 /root/bin/meinscript

/root/bin und /root/temp ist natürlich jetzt nur ein Beispiel, wo es liegen könnte. Mit freetz am besten irgend wo permanent speichern.
 
Zuletzt bearbeitet:
Der Stern in der ersten Spalte bedeutet also jede Minute.

Danke für den Hinweis. Mein Problem ist gelöst. Ich habe eben folgendes getestet:

0,15,38,45 * * * * (sleep 60; kill $$) & exec cat /dev/ttyUSB0 >> /var/media/ftp/Dokumente/easynow_$(date +%Y-%m-%d).txt

Die Prozesse wurden automatisch gestartet und wieder beendet (nach einer Minute).

Bleibt mir nur noch zu sagen: Das * für Dich, die Null nehme ich. ;)
 
Vielen Dank rsi. Ich bin jetzt aber erstmal auf der anderen Spur geblieben. Hat soweit jetzt alles geklappt.
 
Vielen Dank rsi. Ich bin jetzt aber erstmal auf der anderen Spur geblieben. Hat soweit jetzt alles geklappt.

Ok, wenn es funktioniert, ist es gut. Unter Linux führen viele Wege nach Rom. Das ist ja das schöne! ;)

Aber mal eine Frage OffTopic, was hast du an ttyUSB0 hängen??? *neugierig bin*
 
Aber mal eine Frage OffTopic, was hast du an ttyUSB0 hängen??? *neugierig bin*

An der Schnittstelle hängt der Infrarotleser für meinen Stromzähler (EasyMeter). Mit den Paketen usbserial und pl2303 wurde das Gerät sofort erkannt.
 
Interessanter Einsatz für die FritzBox bzw. Freez!
Danke für die Info! ;)
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
244,840
Beiträge
2,219,268
Mitglieder
371,543
Neuestes Mitglied
Brainbanger
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.