Tanj
Tanj

Reputation: 1354

bash script runs from shell but not from cron job

Cron installation is vixie-cron

/etc/cron.daily/rmspam.cron

#!/bin/bash
/usr/bin/rm /home/user/Maildir/.SPAM/cur/*;

I Have this simple bash script that I want to add to a cron job (also includes spam learning commands before) but this part always fails with "File or directory not found" From what I figure is the metachar isn't being interperted correctly when run as a cron job. If I execute the script from the commandline it works fine.

I'd like a why for this not working and of course a working solution :)

Thanks

edit #1 came back to this question when I got popular question badge for it. I first did this,

#!/bin/bash
find  /home/user/Maildir/.SPAM/cur/ -t file | xargs rm

and just recently was reading through the xargs man page and changed it to this

#!/bin/bash
find  /home/user/Maildir/.SPAM/cur/ -t file | xargs --no-run-if-empty rm

short xargs option is -r

Upvotes: 8

Views: 10361

Answers (5)

ulidtko
ulidtko

Reputation: 15643

Is rm really located in /usr/bin/ on your system? I have always thought that rm should reside in /bin/.

Upvotes: 0

janm
janm

Reputation: 18359

If there are no files in the directory, then the wildcard will not be expanded and will be passed to the command directly. There is no file called "*", and then the command fails with "File or directory not found." Try this instead:

if [ -f /home/user/Maildir/.SPAM/cur/* ]; then
    rm /home/user/Maildir/.SPAM/cur/*
fi

Or just use the "-f" flag to rm. The other problem with this command is what happens when there is too much spam for the maximum length of the command line. Something like this is probably better overall:

find /home/user/Maildir/.SPAM/cur -type f -exec rm '{}' +

If you have an old find that only execs rm one file at a time:

find /home/user/Maildir/.SPAM/cur -type f | xargs rm

That handles too many files as well as no files. Thanks to Charles Duffy for pointing out the + option to -exec in find.

Upvotes: 14

bcelary
bcelary

Reputation: 1837

Try using a force option and forget about adding a path to rm command. I think it should not be needed...

rm -f

This will ensure that even if there are no files in the directory, rm command will not fail. If this is a part of a shell script, the * should work. It looks to me that you might have an empty dir...

I understand that the rest of the script is being executed, right?

Upvotes: 0

Ken
Ken

Reputation: 78922

try adding

[email protected]

to the top of your cron file and you should get any input/errors mailed to you.

Also consider adding the command as a cronjob

0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/*

Upvotes: 0

Mark Biek
Mark Biek

Reputation: 150879

Are you specifying the full path to the script in the cronjob?

00 3 * * * /home/me/myscript.sh

rather than

00 3 * * * myscript.sh

On another note, it's /bin/rm on all of the linux boxes I have access to. Have you double-checked that it really is /usr/bin/rm on your machine?

Upvotes: 0

Related Questions