cron, fájltörlés, automatizmus

Egy script letudja magát törölni?

A gondom a következő: Adott egy interaktív script, mely egy másik scriptet (fájlt) készít és ezt beteszi a CRON-ba is.
(dátum, útvonal/script)
Ha lefutott, akkor az elkészült scriptre már nincs szükség, de a cron bejegyzésre sem.

Tudom hogy CRON helyett egyszeri feladatra lehetne használni pld. az at-t is, de azt egyszerűen nem tudom lekezelni. (Egyelőre)
A crontab-ot megtudom nézni a crontab -l-lel. Utólag is tudom módosítani ha a szükség úgy hozza a crontab -e-vel.
Az at-t hogyan?
De akár így, akár úgy, a lefutott scriptre (fájlra) már nem lesz szükség. Előny hogy a dátum benne van a fájlnévben.

Akkor még egyszer két dolog érdekelne:
A lefutott cron bejegyzések, illetve a lefutott scriptek eltávolítása.
Ha a cron helyett mást kéne használni, az sem gond de a man at elég kevés infót ad nekem.

De a cron bejegyzés eltávolítása akkor is érdekes, ha pld. rendszeresen csak két hónapig van a scriptre szükség, utána már nem.
Bár elég nehezen behatárolható hogy meddig van az adott scriptre szükség.
De az biztos ha már nem kell, akár le is törölhetem. Ekkor kéne egy automata megoldás, ami ezután kitörli a crontab-ból is a bejegyzést.
Megoldható ez?

Hozzászólások

?
Akkor most mi is a problád?

at -f destroy_earth.sh teetime

mi ezen a bonyi?!? A futásra váró parancsok listáját meg megkapod atq-val. Hol a gond?

Miért nem jó simán az, hogy?

at 20:30 2010-11-20 <<VEGE
ezt csináld
VEGE

És a man at nálam leírja, hogy az atq listáz.

Az atq valóban kiírja hogy mennyi job van. De ez nagyon kevés infó, mert csak a dátumot és az user nevét írta ki.
Ebből nem tudom meg hogy mi az ami kell még esetleg. S mi van ha elszúrtam?
Tudom esetleg múdosítani. Vag csak törléssel, és újragenerálással?

A másik gondom hogy adott egy mini shellt. Ebben az esetben ezt hogy építem be egy scriptbe?
Mondom. Az at-t nem ismerem.
S ezek alapján eléggé át kéne írnom a már meglévő scriptet, amely a futtatandó fájlt készíti.
Nézem ezeket is.
http://www.brunolinux.com/02-The_Terminal/The_at_Command.html
http://www.linuxvilag.hu/content/files/cikk/11/cikk_11_42_44.pdf

Nos odáig eljutottam, hogy ebben a formában:


#!/bin/bash
....
/usr/bin/at -mf ${at_file} ${OO}:${PP} ${HH}/${NN}/$(date +%Y)

már jónak tűnik a szintaktika, viszont a script jellegéből adódóan nem kellene kiírnia a következő üzenetet:

warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh
job 4 at Tue Nov 23 08:59:00 2010

Hogy tudnám elérni, hogy ezt ne jelenítse meg? Vagy esetleg valami még hiányzik?

Az at-s dolgot kitapasztaltam, megoldottam.
Most jöhet a fekete leves.

cron bejegyzés törlése, ha már nincs meg a szkript amit le kell futtasson. crontab -e helyett valami automatizmusra gondoltam.
A bejegyzések általában két sorból állnak ebben az esetben.

# megjegyzés hogy micsoda
18 40 * * 1-5 /fullpath/mappa/file.sh

A $mappa más sh fájlokat, és log fájlokat is tartalmazhat.

Létezik ere esetleg már egy kész feature?

azt, hogy csak akkor fusson egy script ha létezik, így csinálnám:

test -x /path/script.sh && /path/script.sh

így nem kell törölni, sőt, törlést nem is nagyon szeretek megvalósítani, sem 'rm' parancsot beletenni script-be, mert ha valami gáz van vagy tervezési hiba, akkor rosszul is lefuthat.

vagy

test -x /path/script.sh && $_

(asszem csak bash feature)

Azoknak a scripteknek amiről beszélek az a dolguk hogy sorozatot vegyenek fel a tvkártya segítségével.
De a sorozatoknak előbb utóbb végük van. Ekkor a script manuálisan törlésre kerül. Nem kell hogy felvegye azt ami már nem érdekes.
Viszont a bejegyzések továbbra is ott figyelnek a crontabban. Eddig manuálisan a crontab -e vel szedegettem ki őket.
Erre keresek automatizmust.

"Az at-s dolgot kitapasztaltam, megoldottam."
"cron bejegyzés törlése, ha már nincs meg a szkript amit le kell futtasson"
Nem tejlesen világos, hogy ha megbarátkoztál az at paranccsal, és rábíztad a cronbejegyzések kezelését, akkor miért szükséges manuálisan beavatkozni ebbe. Az at töröl maga után.


$ at 20:23 <<EOF
> /home/user/vegrehajtando.sh
> EOF
warning: commands will be executed using /bin/sh
job 12 at Sun Nov 28 20:23:00 2010

$ atq
12      Sun Nov 28 20:23:00 2010 a user

# date; atq; ls -l /var/spool/cron/atjobs
Sun Nov 28 20:21:28 CET 2010
12      Sun Nov 28 20:23:00 2010 a user
total 4
-rwx------ 1 user daemon 2153 Nov 28 20:21 a0000c01484fab

# date; atq; ls -l /var/spool/cron/atjobs
Sun Nov 28 20:23:30 CET 2010
total 0

$ atq
$

$ crontab -l
# m h  dom mon dow   command

$

Ennek fényében nem értem, hogy miért írtad ezt: "Viszont a bejegyzések továbbra is ott figyelnek a crontabban."

Valamit félreértettem?

Hatalmas félreértés van.
Lehet, sőt egyesek szerint van jobb megoldás is, de én mégis inkább készítettem egy interaktív tvrip nevű szkriptet, melybe többek között beleépítettem a sorozatok esetére a cront, az egyszeri de időzített filmek esetére újabban már az at-t. Nekem ez így jó, holott lehetne paraméterezni az mplayert. De akkor nem is tudnám hogy mi hol merre hány nyóc kalács.

Nos legelőször az volt a dilemma hogy az at parancs lefutott, és a job is megszűnt, viszont ott maradtak a már lefutott mencoder szkriptek. Ezt sikerült megoldanom. Most már az at által felhasznált mencoder scriptek a munka végeztével eltűnnek.

Nos akkor itt van a sorozatok kérdése. Ezt ugye at-val nem igen tudom megoldani, illetve igencsak sok bejegyzést kéne neki adnom akár egy hétre is. Gondoltam talán erre való a cron. Nosza tegyük bele hogy 48 18 * * 1-5 /fullpath/mappa/script.sh
Ahogy az ember az elkészült anyagot rendezgeti, kivágja belőle a reklámokat, stb. előbb utóbb észreveszi, hogy a sorozatnak vége. Ekkor letörli az ezért felelős szkriptet. De a bejegyzés továbbra is ott marad a cronban.
Erről van szó.

Elsőként egy jótanács (nem csak neked). Azért érdemes már a legelején leírni a teljes problémát, nem csak egyes részfeladatokat, mert úgy sokkal egyszerűbb megérteni a feladatot, és az egészet figyelembe véve adni megfelelő javaslatot, és kevesebb lesz a visszakérdezés, pontosítás.

A fenti példa alapján ez nem lenne jó?

# crontab -l | sed '\#/fullpath/mappa/script.sh# d' | crontab -

Tovább cifrázva, ha meg esetleg a sorozat kezdési időpontját módosítják például csütörtök 21.20-ra, akkor:

# crontab -l | sed -r 's#^\s*(([0-9a-zA-Z*/,-]+\s+){5}|@[a-z]+\s+)(/fullpath/mappa/script\.sh.*)#20 21 * * 4 \3#' | crontab -

Természetesen lehet szűrni a sor bármely részére a regexpek megfelelő módosításával.