Řešení 1:
fcron tuto funkci podporuje.
Z dokumentace volby "timezone" v fcrontab(5):
Spusťte úlohu v daném časovém pásmu.timezone-name je řetězec, který je platný pro proměnnou prostředí TZ:více podrobností naleznete v dokumentaci vašeho systému. Například „Evropa/Paříž“ platí v systému Linux. Tato možnost správně zpracovává změny letního času. Proměnná TZenvironment je nastavena na hodnotu časového pásma, když je spuštěna úloha definující tuto možnost.
Řešení 2:
Myslím, že se to snažíš mít oběma způsoby a realita je taková, že to prostě nejde. Pokud chcete, aby se úloha spouštěla například v 8 hodin ráno místního času, bez ohledu na to, zda je aktivní letní čas, spusťte svůj systém (a cron) v místním čase a neprovádějte sezónní úpravy, nebo ji spustíte v UTC ( ne GMT) a provádějte sezónní úpravy. Pokud chcete, aby vaše úlohy běžely ve stejném UTC, bez ohledu , pak spustíte cron podle UTC a už není co dělat.
Pokud chcete, aby uživatel mohl naplánovat úlohu cronu podle svého místního časového pásma a nemusel myslet na konverze pro své pohodlí pak napíšete konverzní skript, který akceptuje specifikaci cronu a časovou zónu, poté provede konverzi na UTC v zákulisí a upraví crontab za něj. Mohlo by se dokonce jednat o obousměrnou konverzi pro zpracování změn existujících záznamů.
Bude užitečné, když nám řeknete, čeho se vlastně snažíte dosáhnout .
Řešení 3:
Můžete si napsat malý obal, který zabere tři argumenty:
- Cílení na hodinu časového pásma, aby odpovídalo
- Cílové časové pásmo
- Příkaz ke spuštění, pokud cílová hodina tz odpovídá aktuální hodině (v cílové hodině tz).
Pak stačí dát tento řádek obalu do crontab, aby se spouštěl každou hodinu:
python tz_wrapper.py 14 "US/Mountain" "echo 'hi'"
Jednoduchá verze pythonu:
#!/usr/bin/python
import sys, os, datetime
import pytz
arg_hour = sys.argv[1]
arg_timezone = sys.argv[2]
arg_cmd = sys.argv[3]
target_tz = pytz.timezone(arg_timezone)
target_hour = pytz.utc.localize(datetime.datetime.utcnow()).astimezone(target_tz).strftime("%H")
if target_hour == str(arg_hour):
os.system(arg_cmd)