Crontab aus Perl

Hallo!

Ich möchte gerne meine Crontab aus Perl heraus ansprechen, dh., nach Entries
suchen
und ggf. welche entfernen oder ersetzen. Klar ginge das auch mit system()
oder mit
Pipes, aber gibt es vielleicht einen eleganteren Weg?

Danke für eure Hilfe, und schöne Grüße aus Wien

Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol [at] adv.magwien.gv.at
Ferry Bolhar [ Mo, 20 März 2006 16:23 ] [ ID #1238036 ]

Re: Crontab aus Perl

Ferry Bolhar schrieb:

> Hallo!
>
> Ich möchte gerne meine Crontab aus Perl heraus ansprechen, dh., nach En=
tries
> suchen
> und ggf. welche entfernen oder ersetzen. Klar ginge das auch mit system()
> oder mit
> Pipes, aber gibt es vielleicht einen eleganteren Weg?

Ich nehme an, daß Du CPAN schon durchsucht hast?

Ich, der ich das nicht getan habe, glaube aber, daß der einzig
portable Weg über die Verwendung des crontab(1)-Kommandos führt.
Ingo Menger [ Mo, 20 März 2006 16:35 ] [ ID #1238037 ]

Re: Crontab aus Perl

"Ferry Bolhar" <bol [at] adv.magwien.gv.at> writes:

> Hallo!
>
> Ich möchte gerne meine Crontab aus Perl heraus ansprechen, dh., nach Entries
> suchen
> und ggf. welche entfernen oder ersetzen. Klar ginge das auch mit system()
> oder mit
> Pipes, aber gibt es vielleicht einen eleganteren Weg?
>

Wenn du root sein kannst, dann würde ich einfach nur Dateien in
/etc/cron.d anlegen, pro Job eine Datei, und man kann mit gewöhnlichen
Dateioperationen arbeiten.

Für echte crontabs ist mir nichts bekannt.

Gruß,
Slaven

--
Slaven Rezic - slaven <at> rezic <dot> de

Berlin Perl Mongers - http://berlin.pm.org
Slaven Rezic [ Mo, 20 März 2006 19:54 ] [ ID #1238042 ]

Re: Crontab aus Perl

Hallo!

Nur, falls es jemand vielleicht interessiert, ich habe jetzt Folgendes
verfasst:

my [at] jobs = `crontab -l`;

push [at] jobs, "30 0 * * * /home/bol/vtx/vtx_test.pl\n";

open OUT, '| crontab' or die "Failed to open pipe to crontab: $!\n";

print OUT [at] jobs or die "Failed to send crontab jobs: $!\n";

close OUT or die "Crontab job submission failed: $?\n";

Zwischendurch (den Code habe ich jetzt aus Gründen der Übersichtlichkeit
weggelassen) durchsuche ich das Array noch nach Jobs, die entfernt werden
sind und lösche die betreffenden Elemente. Soweit funktionierts recht gut;
es ist nur kurios, dass es scheinbar zur crontab keine C API und somit auch
kein Perl-Modul, das darauf aufsetzen könnte, gibt.

PS: Ich bin leider nicht root, darf daher nichts nach /etc schreiben.
Außerdem
war mir eine portable Lösung lieber, da das Ganze unter Linux, FreeBSD, AIX
und True64 laufen muss und ich nicht annehme, dass auf diesen UNIX-Derivaten
das crontab-System überall gleich (d.h., gleiche Verzeichnisse und Dateien)
implementiert ist.

Dennoch danke für eure Hilfe und schöne Grüße aus Wien,

Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol [at] adv.magwien.gv.at
Ferry Bolhar [ Di, 21 März 2006 11:04 ] [ ID #1239821 ]

Re: Crontab aus Perl

Ferry Bolhar wrote:

> es ist nur kurios, dass es scheinbar zur crontab keine C API und somit auch
> kein Perl-Modul, das darauf aufsetzen könnte, gibt.

Hast Du Dir das mal angeschaut?
http://search.cpan.org/~scottw/Config-Crontab-1.11/

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Frank Seitz [ Di, 21 März 2006 11:15 ] [ ID #1239823 ]

Re: Crontab aus Perl

* Ferry Bolhar [2006-03-21]:

Hallo Ferry,

> my [at] jobs = `crontab -l`;

hier solltest du noch Überprüfen, ob der Aufruf erfolgreich war.

Du könntest auch die Option '-e' verwenden und ein Skript als EDITOR
angeben.

> push [at] jobs, "30 0 * * * /home/bol/vtx/vtx_test.pl\n";
> open OUT, '| crontab' or die "Failed to open pipe to crontab: $!\n";
> print OUT [at] jobs or die "Failed to send crontab jobs: $!\n";
> close OUT or die "Crontab job submission failed: $?\n";

> Soweit funktionierts recht gut; es ist nur kurios, dass es scheinbar
> zur crontab keine C API und somit auch kein Perl-Modul, das darauf
> aufsetzen könnte, gibt.

Um Zeilen an eine Datei anzuhängen möchtest du eine extra C-API haben?

Mit dem CPAN hast du es auch nicht so, oder?

http://search.cpan.org/author/SCOTTW/Config-Crontab-1.11/Cro ntab.pm

Gruß
Christian


--
Fühlen Sie sich wie zu Hause - aber benehmen Sie sich nicht so.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Christian Lackas [ Di, 21 März 2006 11:34 ] [ ID #1239827 ]

Re: Crontab aus Perl

Ferry Bolhar wrote:
> Soweit funktionierts recht gut; es ist nur kurios, dass es scheinbar
> zur crontab keine C API und somit auch kein Perl-Modul, das darauf
> aufsetzen k�nte, gibt.

Das ist berhaupt nicht kurios, sondern "the Unix way". Das
Revolution�e an Unix war ja gerade, dass man nicht fr jede Kleinigkeit
eine eigene API brauchte, sondern Tools ber "Files" (die in wiederum
echte Files, Pipes oder Devices sein konnten) kommunizieren konnten.

hp

--
_ | Peter J. Holzer | Löschung von at.usenet.schmankerl?
|_|_) | Sysadmin WSR/LUGA |
| | | hjp [at] hjp.at | Diskussion derzeit in at.usenet.gruppen
__/ | http://www.hjp.at/ |
hjp-usenet2 [ Di, 21 März 2006 18:19 ] [ ID #1239841 ]

Re: Crontab aus Perl

Christian Lackas:

>> my [at] jobs = `crontab -l`;
>
> hier solltest du noch Überprüfen, ob der Aufruf erfolgreich war.

Das geschieht natürlich auch, ich habe das im Beispiel nur aus Gründen der
Übersichtlichkeit weggelassen und nicht weiter erwähnt. Sorry!

> Du könntest auch die Option '-e' verwenden und ein Skript als EDITOR
> angeben.

Kannst du mir ein Beispiel dafür geben?

> > push [at] jobs, "30 0 * * * /home/bol/vtx/vtx_test.pl\n";
> > open OUT, '| crontab' or die "Failed to open pipe to crontab: $!\n";
> > print OUT [at] jobs or die "Failed to send crontab jobs: $!\n";
> > close OUT or die "Crontab job submission failed: $?\n";
>
> > Soweit funktionierts recht gut; es ist nur kurios, dass es scheinbar
> > zur crontab keine C API und somit auch kein Perl-Modul, das darauf
> > aufsetzen könnte, gibt.
>
> Um Zeilen an eine Datei anzuhängen möchtest du eine extra C-API haben?

Wie ich schon schrieb, ist das crontab-System nicht überall einheitlich
implementiert, einheitlich ist nur das Format der crontab-Zeile. Auf unseren
AIX-Kisten (4.3.3) gibt es zB. die Crontab-Datei in dieser Form überhaupt
nicht, 'crontab -e' ruft zwar den Editor auf, doch das was dahinter steckt,
kommt aus einer Pipe, die wiederum von einem wesentlich leistungsfähigeren
Scheduling- und Spoolingsystem beschrieben wird, das in Form einer großen
Database u.a. auch die crontab verwaltet. Das crontab-Programm ist hier
nur eine kompatible Schnittstelle zu diesem Spoolingsystem. Also, nix mit
nur "Zeilen an Datei anhängen".

Und auch auf einem System mit Dateien muss etwas mehr dahinterstecken,
denn der crond muss ja schließlich irgendwie davon verständigt werden,
wenn in der Datei jetzt etwas geändert wird. Daher muss man ja auch
'crontab -e' verwenden und kann nicht einfach so die crontab-Datei
zB. mit dem vi bearbeiten.

> Mit dem CPAN hast du es auch nicht so, oder?
>
> http://search.cpan.org/author/SCOTTW/Config-Crontab-1.11/Cro ntab.pm

Wenn du mir jetzt auch noch verrätst, wie du das gefunden hast - ich habe
nach 'crontab' gesucht, aber das kam leider nicht. Wir haben einen lokalen
CPAN-Mirror hier, da scheint es nicht dabeizusein (obwohl unser SysAdmin
behauptet, der Mirror wäre komplett).

Jedenfalls vielen Dank für den Hinweis, das werde ich mir sicher noch näher
ansehen, obwohl es vermutlich auch nichts anderes macht, als die diversen
crontab-Kommandos über Pipes aufzurufen (sonst wäre es ja nicht portabel).
Dennoch, danke an alle für ihre Hilfe.

Schöne Grüße aus Wien,

Ferry
--

Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol [at] adv.magwien.gv.at
Ferry Bolhar [ Mi, 22 März 2006 11:01 ] [ ID #1241680 ]

Re: Crontab aus Perl

* Ferry Bolhar [2006-03-22]:

Hallo Ferry,

> > Du könntest auch die Option '-e' verwenden und ein Skript als EDITOR
> > angeben.
> Kannst du mir ein Beispiel dafür geben?

#! /usr/local/bin/perl -w
use Fcntl qw'O_RDWR SEEK_SET';
sysopen CRONTAB, $ARGV[0], O_RDWR or die $!;
my [at] lines = <CRONTAB>;
# do something, e.g.
push [at] lines, "* * * * * echo Hallo Welt\n";
seek CRONTAB, 0, SEEK_SET;
print CRONTAB [at] lines;
close CRONTAB;

und dann

EDITOR='./script.pl' crontab -e

> > Um Zeilen an eine Datei anzuhängen möchtest du eine extra C-API haben?
> Wie ich schon schrieb, ist das crontab-System nicht überall einheitlich
> implementiert, einheitlich ist nur das Format der crontab-Zeile.

Du sollst schon nur über crontab(1) drauf zugreifen. Trotzdem ist es
nicht mehr als das Hinzufügen/Löschen/Ändern einer Zeile. Was dahinter
steht ist ja nicht weiter relevant.

> Und auch auf einem System mit Dateien muss etwas mehr dahinterstecken,
> denn der crond muss ja schließlich irgendwie davon verständigt werden,
> wenn in der Datei jetzt etwas geändert wird.

Der cron schaut normalerweise alle paar Sekunden nach, ob sich seine
Tables (unter FreeBSD unter /var/spool/tabs) oder die System-Tabelle
(/etc/crontab) geändert haben.

> Daher muss man ja auch 'crontab -e' verwenden und kann nicht einfach
> so die crontab-Datei zB. mit dem vi bearbeiten.

Die /etc/crontab editiere ich immer mit vi. Nur für die User-Tabellen
verwendet man crontab(1). Beim root geht man -- wie üblich -- davon aus,
dass er weiss was er tut, bei Usern wird das Format ja von crontab noch
geprüft.

> > Mit dem CPAN hast du es auch nicht so, oder?
> > http://search.cpan.org/author/SCOTTW/Config-Crontab-1.11/Cro ntab.pm
> Wenn du mir jetzt auch noch verrätst, wie du das gefunden hast - ich habe
> nach 'crontab' gesucht, aber das kam leider nicht. Wir haben einen lokalen
> CPAN-Mirror hier, da scheint es nicht dabeizusein (obwohl unser SysAdmin
> behauptet, der Mirror wäre komplett).

Ich habe <Überraschung> die Suchmaschine aus obiger URL benutzt :-)

http://search.cpan.org/

Wo hast du denn gesucht?

Gruß
Chrisitan

--
Wer morgens zerknittert ist, hat tagsüber viele
Entfaltungsmöglichkeiten.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Christian Lackas [ Mi, 22 März 2006 11:55 ] [ ID #1241681 ]

Re: Crontab aus Perl

Ferry Bolhar skribis:

> Wie ich schon schrieb, ist das crontab-System nicht überall einheitlich
> implementiert, einheitlich ist nur das Format der crontab-Zeile. Auf unseren

Nein, nicht mal das.
Matthias Peick [ Mi, 22 März 2006 20:40 ] [ ID #1241688 ]
Perl » de.comp.lang.perl.misc » Crontab aus Perl

Vorheriges Thema: RE, Greedy-Verhalten
Nächstes Thema: regex strings ignorieren