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'