Ubuntu-ontwikkelaar Dustin Kirkland heeft voor Ubuntu 11.04 de commando's run-one en run-this-one geschreven, beide beschikbaar in het pakket run-one. Onder eerdere versies van Ubuntu is het pakket ook beschikbaar als je de PPA ppa:run-one/ppa installeert. Overigens zijn beide commando's eenvoudige shell-scripts, dus ook onder andere distributies kun je ze gebruiken.

Trage cronjobs

Run-one werd geboren uit een probleem dat Kirkland met trage cronjobs had: als een hourly cronjob zoals een synchronisatie met rsync langer dan een uur duurde (bijvoorbeeld omdat de netwerkverbinding traag was), dan had Kirkland op zijn systeem al vlug meerdere rsync-taken tegelijk draaien. Om dit tegen te gaan, moet je gewoon run-one voor je commando plaatsen in de cronjob, bijvoorbeeld:

*/60 * * * * run-one rsync -azP $HOME example.com:/srv/backup

Run-one berekent de md5sum hash-waarde van het commando, inclusief zijn argumenten, en probeert dan met het flock-commando een lock te krijgen op het bestand $HOME/.cache/$HASH. Als dat lukt, wordt het commando uitgevoerd en geeft run-one de lock pas vrij wanneer het commando voltooid is.

Als het niet lukt, dan betekent dit dat hetzelfde commando al draait, en dan stopt run-one gewoon met een exit-code die een fout aangeeft. Het resultaat is dat je er altijd zeker van bent dat dit commando nooit meer dan één keer tegelijk wordt uitgevoerd.

Breek processen af

Het commando run-this-one doet iets gelijksoortigs, maar dan voor andere situaties. Stel dat je vaak een ssh-tunnel start met hetzelfde commando, maar dat na een tijd de ssh-verbinding blijft hangen door netwerkproblemen, terwijl het proces nog blijft draaien. Dan moet je vaak het oude commando eerst killen voor je het nog eens opstart.

Het commando run-this-one doet dit al voor je als je het voor het commando zet dat je wilt uitvoeren. Run-this-one zoekt met pgrep naar nog draaiende versies van je commando en killt deze eerst, waarna het het commando uitvoert. Hierdoor ben je ervan verzekerd dat je laatste oproep van het commando wel degelijk uitgevoerd wordt.