[Ratkaisu] Cronin suorittama komentojonotiedosto ei toimi

Lähtökohta
Olen luonut komentojonotiedoston komentojono1, joka kutsuu komentojonotiedostoa komentojono2 seuraavanlaisella rivillä:

komentojono2 parametri1 parametri2

Olen tallentanut molemmat komentojonotiedostot kotihakemistoni alla olevaan bin-alihakemistoon. Bin-alihakemisto on määritelty komentojenhakupolkujen (PATH-muuttuja) joukkoon komentoriviprofiilissani. Olen muuttanut molempien komentojonotiedostojen oikeuksia niin, että molemmat toimivat komentoriviltä suoritettuina.
Olen lisännyt komentojono1:n crontab-tiedostooni siten, että se suoritetaan kerran minuutissa:

* * * * * /home/jani/bin/komentojono1
Ongelma
Kerran minuutissa automaattisesti suoritettuna komentojono1 ei toimi odottamallani tavalla, niin kuin se toimii komentoriviltä suoritettuna.
Ongelman syy
Olen kutsunut komentojono1:ssä komentojono2:ta ilman täyttä hakemistopolkua sen edessä. Kun cron suorittaa komentojono1:n, se ei lue komentoriviprofiiliani sitä ennen, eikä siksi tiedä etsiä komentojono2:ta kotihakemistoni alla olevasta bin-hakemistosta.
Ratkaisu
Muutan komentojono1:tä niin, että komentojono2:n kutsu tehdään käyttämällä täyttä hakemistopolkua itse tiedoston nimen edessä:

/home/jani/bin/komentojono2 parametri1 parametri2

Tämän jälkeen komentojono1:n automaattinen suoritus toimii tarkoittamallani tavalla.

Huomautuksia
  • Yleisesti ottaen cronin suoritus poikkeaa vuorovaikutteisesta komentorivisuorituksesta siksi, että Ubuntussa käytettävien vuorovaikutteisten komentorivien tulkkina toimii Bash, ja cron taas puolestaan käyttää /bin/sh -komentoa, joka on symbolinen linkki dash-tulkkiin. Kun cron ajaa dashin ei-vuorovaikutteisena, se ei lue mitään profiilitiedostoja, ja siten nämä kaksi ympäristöä (crontab ja vuorovaikutteinen komentorivitulkkisovellus kuten Pääte) voivat poiketa toisistaan huomattavastikin.
  • Pitemmän päälle tässä kuvattua elegantimpi ratkaisu olisi luultavasti luoda komentojonotiedosto cron-suoritus, joka ottaa parametrinä komentojonotiedoston parametreineen. Cron-suoritus lukisi komentoriviprofiilini ja lisäksi selvittäisi DBUS_SESSION_BUS_ADDRESS -muuttujan arvon ennen kuin suorittaisi sille komentorivillä annetun komentojonotiedoston parametreineen.

    Sen jälkeen lisäisin /home/jani/bin/cron-suoritus -komentojonon aina varsinaisen komentojonotiedoston ja sen parametrien eteen aina, kun haluaisin suorittaa komentojonotiedoston crontabin kautta automaattisesti. Silloin crontabin suorittamien komentojonotiedostojen ajo muistuttaisi enemmän niiden suorittamista komentoriviltä ilman, että jokaiseen komentojonotiedostoon täytyisi tehdä crontabista ajamisen huomioonottavia tarkennuksia ja erityisehtoja.

    Koska cron-suoritus lukisi komentoriviprofiilini ennen sille annetun komentojonon suorittamista, ei tämän komentojonon eteen tarvitsisi crontabissa lisätä täyttä hakemistopolkua:

    * * * * * /home/jani/bin/cron-suoritus komentojono parametri

Comments

2 responses to “[Ratkaisu] Cronin suorittama komentojonotiedosto ei toimi”

  1. […] lisätty muistiapukomento ei ole käytettävissäni crontab-tiedostossa, koska cron ei lue komentoriviprofiiliani eikä siksi tiedä […]

  2. Vuorovaikuttaja Avatar

    Tein alustavan version tuosta suunnittelemastani cron-suorituksesta cronbash-nimiseen komentojonotiedostoon. Sen sisältö näyttää nyt tältä:

    #!/bin/bash
    if [ "$1" = "" -o ! -x "$1" ]; then
    echo "`basename $0`: kelvoton komentoparametri (tai ei parametria ensinkään)." 1>&2
    exit
    fi

    # include .profile if it exists
    if [ -f /home/jani/.profile ]; then
    . /home/jani/.profile
    fi

    export LC_ALL=fi_FI.UTF-8

    "$1"