Cronjob wordt niet uitgevoerd

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
Ik heb de volgende crontab
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PATH=/usr/local/bin

# check if resque tasks needs to be generated
* * * * * cd /rails_application/current && RAILS_ENV=production rake cron:generate_resque_tasks

#send the daily mails
2 0 * * * cd /rails_application/current && RAILS_ENV=production rake cron:send_daily_emails

#check if a scraper task alert email needs to be sent
@hourly cd /rails_application/current && RAILS_ENV=production rake cron:check_scraper_task_runs

#Setup NTPDATE
@hourly /etc/network/if-up.d/ntpdate

#remove old temporary files for open-uri
@hourly /usr/bin/find /tmp/open-uri* -mmin +120 -exec rm {} \;

# This file is checked by Nagios so it can determine if the cronjob is still running
* * * * * /bin/date > /var/log/successfull_cron


De volgende regel lijkt niet te werken:
code:
1
2
#remove old temporary files for open-uri
@hourly /usr/bin/find /tmp/open-uri* -mmin +120 -exec rm {} \;

Ik heb het even gechecked en ik vind nu (24 januari 10.40 uur) nog keurig bestanden die voldoen aan het criteria '/tmp/open-uri*' daterend van 23 januari 20.45 uur.
Ik dacht toch echt dat de cronjob na 120 minuten de bestanden verwijder :S

Anyhow als ik handmatig de volgende code uitvoer in bash dan worden de bestanden die aan het criteria voldoen WEL verwijderd:
code:
1
/usr/bin/find /tmp/open-uri* -mmin +120 -exec rm {} \;


Ik heb ook gekeken in '/var/log/syslog', maar de cronjob lijkt goed te lopen. Iemand enig idee?

Ik heb even met het command 'top' gekeken of 'find' gaat lopen. Dat gebeurt wel, maar zonder resultaat.
Ook als ik de output probeer weg te schrijven naar een logfile, krijg ik een lege logfile:
code:
1
@hourly /usr/bin/find /tmp/open-uri* -mmin +120 -exec rm {} \; > /var/log/temp_log

[ Voor 9% gewijzigd door van.der.schulting op 24-01-2012 11:43 ]


Acties:
  • 0 Henk 'm!

  • Retaliator
  • Registratie: April 2002
  • Laatst online: 28-08 10:28
Kan het zijn dat de cronjob onder een andere gebruiker wordt uitgevoerd? Het kan natuurlijk een rechtenkwestie zijn.

Acties:
  • 0 Henk 'm!

  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
Volgens mij niet, het is de crontab van de root...
Ik heb het nog even nagekeken in '/var/log/syslog':\
code:
1
Jan 24 08:00:01 prod-app01 /USR/SBIN/CRON[14814]: (root) CMD (/usr/bin/find /tmp/open-uri* -mmin +120 -exec rm {} \;)

[ Voor 4% gewijzigd door van.der.schulting op 24-01-2012 11:41 ]


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 03-10 18:55

Kees

Serveradmin / BOFH / DoC
Met '>' vang je alleen de stdout op, niet de stderr. Gooi eens '&> /tmp/cron.log' oid erachter.

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • Elijan9
  • Registratie: Februari 2004
  • Laatst online: 01-10 15:44
Voor zover ik weet wordt de '*' niet geëxpandeerd in een crontab, iets wat bash bijvoorbeeld wel doet. Jouw command in cron staat dan in feite gelijk aan het volgende in bash:
code:
1
/usr/bin/find /tmp/open-uri\* -mmin +120 -exec rm {} \;



Het volgende werkt beter, al krijg je hierdoor mogelijk "permission denied" foutmeldingen op stderr (en dus in jouw mailbox/syslog) voor paden waar je niet bij kan/mag...
code:
1
/usr/bin/find /tmp/ -wholename '/tmp/open-uri*' -mmin +120 -exec rm {} \;



offtopic: je kunt ook rechtstreeks de "-delete" optie van find gebruiken.

War is when the young and stupid are tricked by the old and bitter into killing each other. - Niko Bellic


Acties:
  • 0 Henk 'm!

  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
het bleek hem te zitten in '-exec rm {} \;':

Dit werkt namelijk wel...
code:
1
* * * * * /usr/bin/find /tmp/ /tmp/open-uri\* -mmin +120 -delete


Kan iemand me uitleggen waarom de '-delete' optie juist wel werkt en het andere niet??

[ Voor 62% gewijzigd door van.der.schulting op 25-01-2012 10:22 ]


Acties:
  • 0 Henk 'm!

  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
Misschien een kopieerfoutje: In het tweede codevoorbeeld ontbreekt een spatie tussen "*" en "/usr/bin/find".

Cron expandeert wildcards *wel* (ik maak er zelf gebruik van).

Probeer eens in plaats van
code:
1
-exec rm {} \;

het volgende:
code:
1
-exec /bin/rm -f {} +
  1. volledige padnaam van het rm-commando (je PATH-instelling aan het begin is wel heel restrictief en rm staat vast niet in /usr/local/bin)
  2. optie -f (force) toevoegen
  3. de + ipv de ; heeft twee voordelen: je hoeft 'm niet te quoten zodat je geen problemen krijgt met meerdere levels van quote-stripping EN het zorgt voor een performanceverbetering, omdat het (net als xargs) zo veel mogelijk filenamen per rm-aanroep invoegt
Uitvoer van cronjobs naar stdout en stderr wordt door cron opgevangen en met mail naar de eigenaar van de cronjob gestuurd. Je hoeft dus niet moeilijk te doen met allerlei logfiles. Gewoon de e-mail van root lezen.
Of zet een alias voor root in /etc/aliases, dan wordt het naar je eigen account gestuurd.

Edit: zag net in de manual page van find de optie -delete.
Vervang
code:
1
-exec /bin/rm -f {} +

eens door
code:
1
-delete

?

[ Voor 6% gewijzigd door sam.vimes op 25-01-2012 11:30 . Reden: -delete ]

Pagina: 1