Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Is it possible to make cron receive it's instructions from the output of a shell script instead of reading a static file?

I'm trying to manage crontabs across a bunch of machines and maintaining separate crontab files for each machine is a chore. I'd like cron to instead run a shell script that prints out crontab lines for each job based on whether a given machine is assigned to that job. Can I do this?

P.S.- I've seen some suggest Puppet/Chef/etc. for this purpose, but I think that's overkill for handling just this one problem.

share|improve this question
up vote 0 down vote accepted

I think the easiest way to do this on most distributions would be using automated deployment tools like Puppet/Chef as well as the /etc/cron.d directory. You can place crontabs in that directory, except they use the following format rather than the typical one:

* * * * * <user> <command>

Where is the user that will be running the cron.

You seem to think Puppet is overkill (it's not), but the directory part would apply to any other solution as well.

share|improve this answer

Yes, of course you can do this. Just setup whatever script you need to produce crontab output, and scp it to the target servers.

There, a static cron job can then specifically read those crontabs to execute, from whatever location is convenient.

share|improve this answer

This is exactly the intended use for puppet and friends.

Your only entry in the crontab could be to run the puppet agent, if you don't like how it is setup by the package-management of your distribution.

The external script would be on the puppet-master. In one place. For all machines.

If it is enough of a problem to consider using an external script, I recommend puppet. Chef can surely do something similar.

I started with puppet just to manage the ~/.ssh/authorized_keys on multiple machines, which is a similar "small" problem.

share|improve this answer

A popular trick is to make a crontab entry which updates the whole crontab. This will work fine as long as your shell script never feeds bad data to crontab.

However, I suggest a different approach which will be easier to manage: have a static crontab entry which runs a script frequently. Make the script do all the heavy lifting of figuring out when it's time to run something. This way, you can still use the crontab as a regular crontab without having to make the script know about everything that could be running on every machine.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.