Soluzione 1:
fcron supporta questa funzione.
Dalla documentazione dell'opzione "timezone" in fcrontab(5):
Eseguire il lavoro nel fuso orario specificato.nome-fuso orario è una stringa valida per la variabile d'ambiente TZ:vedere la documentazione del proprio sistema per maggiori dettagli. Ad esempio, "Europe/Paris" è valido su un sistema Linux. Questa opzione gestisce correttamente le modifiche all'ora legale. La variabile TZenvironment è impostata sul valore di timezone quando viene eseguito un lavoro che definisce questa opzione.
Soluzione 2:
Penso che tu stia cercando di avere entrambe le cose e la realtà è che non puoi proprio. Se si desidera che un lavoro venga eseguito alle 8:00 ora locale, ad esempio, indipendentemente dal fatto che sia attiva l'ora legale, è possibile eseguire il sistema (e cron) nell'ora locale e non apportare modifiche stagionali o eseguirlo in UTC ( non GMT) e apportare modifiche stagionali. Se vuoi che i tuoi lavori vengano eseguiti allo stesso UTC, a prescindere , quindi esegui cron secondo l'ora UTC e non c'è altro da fare.
Se quello che vuoi è che un utente sia in grado di pianificare un cron job in base al suo fuso orario locale e non debba pensare alle conversioni per sua comodità quindi scrivi uno script di conversione che accetta una specifica cron e un fuso orario, quindi esegue la conversione in UTC dietro le quinte e modifica il crontab per lui. Potrebbe anche essere una conversione bidirezionale per gestire le modifiche alle voci esistenti.
Ti sarà utile se ci dici cosa stai effettivamente cercando di realizzare .
Soluzione 3:
Potresti scrivere tu stesso un piccolo wrapper che accetta tre argomenti:
- Ora del fuso orario target da abbinare
- Fuso orario target
- Comando da eseguire se l'ora target tz corrisponde all'ora corrente (in target tz).
Quindi metti quella riga wrapper nel tuo crontab per essere eseguita ogni ora:
python tz_wrapper.py 14 "US/Mountain" "echo 'hi'"
Versione Python semplice:
#!/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)