GNU/Linux >> Znalost Linux >  >> Linux

Bashscript funguje z terminálu, ale ne z Crontabu?

Mám spoustu CronJobů a fungují dobře, kromě jednoho. Prohledal jsem spoustu fór a webů a zkusil jsem kombinaci věcí, ale bohužel nic nefungovalo.

Přeformulování otázky zní:

Otázka: Bashscript funguje bez problémů z terminálu. Ale s CronJobem to vůbec nefunguje.

Poslední věc, kterou jsem pro ladění udělal, je následující:

1) Zkontrolováno, zda běží Cron Daemon (ps ax | grep ) =funguje

2) Udělal jsem extra chronovou úlohu (znovu otestoval), aby mi každou minutu poslal e-mail (* * * * * echo "hello" | mail -s "subject" [email protected] ) =funguje dobře

3) Spustil jsem svůj bash skript přes terminál jako samostatný =fungoval dobře

4) Zkontroloval jsem grep CRON /var/log/syslog za případné chyby =vypadá dobře/bez chyb

5) Kontrola oprávnění atd. =žádné problémy s oprávněními

6) Cesta k souboru ke skriptu bash pro úlohu cron vypadá dobře

#!/bin/bash

#When adding any additional machines make sure there are two files
#within the directory. MACHINE_NAMEMACHINE_NUMBER_initial_time.txt
#and MACHINE_NAMEMACHINE_NUMBER_old_ignition_value.txt

#./engine_switch_check.txt MACHINE_NAME MACHINE_NUMBER

echo `date +%T` >> test.txt

./engine_switch_check.txt MXE 065
./engine_switch_check.txt TMX5BP 001
./engine_switch_check.txt MX3 122
./engine_switch_check.txt TMX 098

a soubor engine_switch_check.txt :

#!/bin/bash

mc_id="$1"        #-->eg: TMX
mc_no="$2"        #-->eg: 098
echo "$mc_id $mc_no"

#echo "1--$mc_id$mc_no-DATAFILE.txt"
mc_fname=$mc_id$mc_no'_old_ignition_value.txt'
echo $mc_fname


#old_ignition_value=$(sed -n '1p' $mc_fname)
#echo "2--$old_ignition_value"
#old_ignition_value=$(sed -n '1p' $mc_id$mc_no'DATAFILE.txt')
#echo "3--$old_ignition_value"
new_ignition_value=`get values from the terminal`
old_ignition_value=$(sed -n '1p' $mc_id$mc_no'_old_ignition_value.txt')


echo "Program name: $0"
echo "New Ignition Value: $new_ignition_value"
echo "Old Ignition Value: $old_ignition_value"
echo;echo;echo

#difference_btwn_new_old_ign_values=$(awk '{print $1-$2}' <<< "$new_ignition_value $old_ignition_value")

difference_btwn_new_old_ign_values=$(($new_ignition_value - $old_ignition_value))
#difference_btwn_new_old_ign_values= expr new_ignition_value - old_ignition_value

echo "$new_ignition_value"
echo "$old_ignition_value"
echo "$difference_btwn_new_old_ign_values"

if [ "$difference_btwn_new_old_ign_values" -lt "1" ]
then
    > $mc_id$mc_no'_initial_time.txt'
    initial_time=`date +"%s"`    
    echo $initial_time >> $mc_id$mc_no'_initial_time.txt'
fi

if [ "$difference_btwn_new_old_ign_values" -ge "5" ]
then
    final_time=`date +"%s"`
    initial_time=$(sed -n '1p' $mc_id$mc_no'_initial_time.txt')
    echo;echo;echo "initial time: $initial_time"
    echo "final time: $final_time"
  #initial_time=0000
    time_difference_in_sec=$(( $final_time - $initial_time ))

    echo "time difference in sec: $time_difference_in_sec"

    time_difference_in_min=$(( $time_difference_in_sec / 60 ))


    if [ "$time_difference_in_sec" -le "3600" ]
    then
      email_subject="$mc_id $mc_no switched on $difference_btwn_new_old_ign_values times within $time_difference_in_min minutes"

            `echo -e "Hi there,nn$mc_id $mc_no has been switched on $difference_btwn_new_old_ign_values times within the last $time_difference_in_min minutesnnCheers," | mail -s "$email_subject" $email_list`

      echo "EMAIL SENT"

: <<'psuedo'

      > $mc_id$mc_no'_old_ignition_value.txt'
      echo $new_ignition_value >> $mc_id$mc_no'_old_ignition_value.txt'

psuedo
    fi  

    if [ "$time_difference_in_sec" -gt "3600" ]
    then

            > $mc_id$mc_no'_initial_time.txt'
            initial_time=`date +"%s"`    
            echo $initial_time >> $mc_id$mc_no'_initial_time.txt'


    fi
fi

Podrobnosti týkající se e-mailu jsem vyškrtl, ale tento řádek funguje dobře.

Upřímně nevím, co jiného můžu dělat. Jediný rozdíl s tímto bash souborem je v tom, že z něj volá jiný „spustitelný soubor txt“. A oba tyto soubory fungují skvěle z terminálu samy o sobě.

Související:Jak zobrazit „nejlepší“ výsledky seřazené podle využití paměti v reálném čase?

Aktualizace (18. 2. 2015):
Dále jsem zkoušel CronTab tak, že jsem napsal jiný (jednodušší) skript pro rozesílání časového razítka e-mailem, časové razítko jsem také zaznamenal do souboru .txt – což fungovalo bez problémů. Přepsal jsem to, protože jsem si myslel, že CronTab nefungoval tak, jak by měl.

Pro každého, kdo má podobný problém, je několik možností, které byste měli zvážit:
Další věci, které jsem udělal při odstraňování problémů (není v pořádku)

  • Vytvořil echo v textovém souboru, aby zjistil, zda byl program spuštěn
  • Vyhýbejte se používání sudo crontab -e všichni doporučují držet se dál od sudo crontab -e
  • Zkontrolovali jste cestu k adresáři v crontab
  • Čtěte/znovu čtěte různá fóra, čtěte/znovu si přečtěte můj program znovu a znovu (požádejte někoho jiného, ​​kdo rozumí programování, aby to udělal, protože čerstvé oči vidí, co vám může uniknout)
  • Do crontab byly přidány PATH a SHELL
  • Přidány různé úlohy CronJob (zmíněná aktualizace 18/02/15)
  • Změněna relativní cesta na úplnou cestu ve všech programech To umožnilo práci s crontab

Přijatá odpověď:

Myslím, že musíte ve skriptu nastavit proměnnou path

Například

PATH='/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin'

Linux
  1. Proč není Nullglob výchozí?

  2. Proč to „při čtení“ funguje v terminálu, ale ne ve skriptu Shell?

  3. Stáhnout obrázek Funguje ve Firefoxu, ale ne v Internet Exploreru

  1. Jak zabránit uživateli bez oprávnění root ve vytváření záznamu crontab

  2. Cron Script se nespouští podle očekávání z crontab – Odstraňování problémů

  3. Jakýkoli způsob, jak ukončit bash skript, ale ne opustit terminál

  1. Postgres neumožňuje localhost, ale pracuje s 127.0.0.1

  2. Pycharm tensorflow ImportError, ale funguje dobře s Terminálem

  3. Jak spustit GUI linuxové programy z příkazového řádku, ale odděleně od příkazového řádku?