Spyke
selfhost·Self Hosted - Self-hosting your services.byAlvaro

It is always a struggle configuring a cronjob to run certain scripts; there is always a mis configuration, a PATH, an environment variable that is different from when you use it in interactive mode, e

It is always a struggle configuring a cronjob to run certain scripts; there is always a mis configuration, a PATH, an environment variable that is different from when you use it in interactive mode, etc.. Do you have any tricks to avoid or minimize those issues?

cc @[email protected]

View original on social.graves.cl

Use a systemd-service + systemd-timer. You can then run "systemctl start myjob.service" to check that it runs as you expect. If it works "systemctl enable --now myjob.timer" to kick it off as scheduled

11

You can use crontab -e from user. That set user environment to usual state. Or you can use systems timers instead crontab.

Or you can set all environment variables inside cron file.

5

Depending on what your setup is like, you could use something other than cron.

Kubernetes and Nomad both have cron-like schedulers. It's convenient to keep your cronjob definitions near the app code.

I've also been using windmill.dev lately for some simple cronjob-like tasks and it's working pretty great. It also has a UI if that helps.

2

I basically combine a few mechanisms to mitigate that:

  • Having cron call scripts deployed to a fixed location I can manually test or use on demand as needed
  • Piping each script's output/exit code to healtchecks.io so I can get feedback notifications when/if they fail
  • Using Ansible to deploy everything so it's all repeatable and version controlled
1

Put all the logic in a php file and just configure crontab to run the file at the given interval and output the results to a log file. Use crontab.guru to help with scheduling.

1

Always use absolute path. If you write some shell snippet which may be run in different environment, avoid use just command name for uncommon one.

1

If Cron is too hard for you (it is really easy so I don't really understand your problems) then check out runat instead. Simple and easy to use with all the features I would suspect you use in cron

1

@[email protected] good old Ubuntu , but it runs sh instead of my own zsh, path is different etc.

I’ve had to manually edit the env variables which is a pain because I forget to update the cronjob path as well

1

Wrap all the cron job tasks in a bash script and make sure it works. Call the script directly in the cron configuration. Dump the output of the cronjob to a logfile. Set it up to run every minute so you can ensure it works via the cron environment.

1

You reached the end

It is always a struggle configuring a cronjob to run certain scripts; there is always a mis configuration, a PATH, an environment variable that is different from when you use it in interactive mode, e | Spyke