ACPIウェイクアップを設定して、ラップトップが毎朝特定の時間にウェイクアップするようにしました。これのタイムゾーンはUTCです。 UTCを使用してcrontabもセットアップし、ウェイクアップアラームに適合するようにします。
どうやってやるの?
次を含めるように/etc/default/cron
を編集しようとしました:
TZ="UTC"
しかし、それは機能しません。 (TZ=UTC
とTZ="UTC/GMT"
も試しました)
何か案は?
Trusty(14.04)でも同様の問題がありました。マシンのタイムゾーンを設定し、cron
サービスを再起動することで解決しました
Sudo dpkg-reconfigure tzdata
-指示に従って地域/国を選択しますSudo service cron restart
これを達成する簡単な方法はありません。 cronは現地時間を使用します。 /etc/default/cron
およびcrontabの他のTZ
仕様は、cronによって開始されるプロセスに使用するTZ
を指定するだけで、開始時間には影響しません。
私が見たほとんどのソリューションは中央にユーティリティを含むため、cronはUTCで開始するタイミングを決定するものを開始します(たとえば、DSTの変更のみを懸念している場合、2時間前に開始し、計算しますat
をご覧ください。そうするために、人々はPerl
またはpython
または同様のスクリプト言語をよく使用します)。
あなたが望むなら、それをハックする厄介な方法があります。 cronは、起動時にシステムからTZ情報のみを読み取ります。したがって、これが常に実行されているサーバーである場合は、TZをUTCに設定して再起動し、起動後にローカルタイムゾーンに設定するだけで済みます。これもスクリプト化できます。
代替アプローチとして、cronの@reboot
構文も参照してください。これは、起動後にスクリプトを実行する必要があります。
2017年3月の時点で、crondは各crontabでCRON_TZ変数をサポートしていることを発見しました。
CRON_TZ変数は、cronテーブルに固有のタイムゾーンを指定します。ユーザーは、指定されたタイムゾーンに従って時間をテーブルに入力する必要があります。ログファイルへの書き込みに使用される時間は、デーモンが実行されているローカルタイムゾーンから取得されます。
— crontab(5)のマニュアルページから引用
これにより、各cronジョブをローカル時間で実行する時間を指定でき、サーバーはUTCのままで、DSTを自動的に計上しました。
システムのタイムゾーンを制御するファイルがあります。同じ問題が発生しました。解決策を次に示します。
タイムゾーンを手動で設定していない場合、date
を実行するとUTC時間が表示されます。
バックアップを作成する
Sudo cp /etc/localtime /etc/localtime.bkp
ファイルを削除します。
Sudo rm /etc/localtime
私はシカゴに住んでいます(タブキーを使用してパスを変更する必要がある場合があります)。
Sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
次に再起動します。システムの起動時:日付
今、あなたのタイムゾーンはそこにあるはずであり、cronはこれを見ていきます。
参考までに、TZ変数の設定は一時的な解決策であり、「マスク」として機能する場合があります。
OK、Ubuntu Nattyでこれを行う方法を考えてみましたが、ここでそれを機能させました。もっとエレガントな方法があるかもしれませんが、この方法は機能します。
まず、TZ変数を設定するシェルでcron実行可能ファイルをラップする必要があります。方法は次のとおりです。
cd /usr/sbin
mv cron cron.real
次に、新しい/ usr/sbin/cronファイルを作成します。私はvimを使用しましたが、必要なエディターを使用できます。ファイルは次のようになります。
#!/bin/bash
export TZ=UTC
/usr/sbin/cron.real
新しいcronファイルを実行可能にします。
chmod ugo+rx cron
次に、cronデーモンを再起動します。
service cron restart
これで、cronジョブはUTCベースのスケジュールで実行されます。ただし、実行される時間がUTCであっても、実行時にシステムに定義されているものにタイムゾーンが設定されます。これを変更するには、次のコマンドの前にcrontabに配置します。
TZ=UTC
したがって、crontabは次のようになります。
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
TZ=UTC
00 19 * * * date > /tmp/date.log
/etc/default/cron
を参照してください。ここで-all- crontabsのTZ
を設定できます。TZ=UTC
iircにする必要があります。したがって、メソッドは機能しているはずです。
fcron をご覧ください。異なるタイムゾーンで個別のcrontabを設定できます:
timezone-name 'time zone of the system'
指定されたタイムゾーンでジョブを実行します。 timezone-nameは、環境変数TZに有効な文字列です。詳細については、システムのドキュメントを参照してください。たとえば、「Europe/Paris」はLinuxシステムで有効です。このオプションは、夏時間の変更を正しく処理します。このオプションを定義するジョブが実行されると、TZ環境変数はタイムゾーンの値に設定されます。
誤ったtimezone-name引数を指定した場合、それは黙って無視され、ジョブはシステムのタイムゾーンで実行されることに注意してください。
Ubuntu固有のソリューションについては、 私の次の投稿 を参照してください
これはUbuntuフォーラムであることは知っていますが、答えはRed Hatシステムでこれを行う方法と非常に似ていると思います。これをテストするのに便利なUbuntuシステムはありませんが、Red Hatでテストしました。
必要なのは、cronデーモンのinitスクリプトに行を追加することだけです。次のように、環境変数TZを設定およびエクスポートします。
export TZ=UTC
次に、cronデーモンを再起動します。このエクスポートを他の変数の設定とソースの後にcronデーモン起動スクリプトに入れてください-/etc/default/cron
スクリプトの元のポスターの編集が彼のために機能しなかった理由だと思います。多分彼はそれを設定しましたが、スクリプトのさらに下の何かによってリセットされました。
これはcronデーモン自体にのみ影響し、cronを介して実行するジョブには影響しないことに注意してください。したがって、cronジョブでタイムゾーンとしてUTCを使用する場合は、ジョブ自体にも設定する必要があります。
たぶんこの言葉をそのままコピーしてUbuntuボックスで動作させることはできないでしょうが、Red Hatでこれをテストするために使用したinitスクリプトを次に示します。 start()
関数の直前にエクスポートがあります。
#!/bin/sh
#
# crond Start/Stop the cron clock daemon.
#
# chkconfig: 2345 90 60
# description: cron is a standard UNIX program that runs user-specified \
# programs at periodic scheduled times. vixie cron adds a \
# number of features to the basic UNIX cron, including better \
# security and more powerful configuration options.
### BEGIN INIT INFO
# Provides: crond crontab
# Required-Start: $local_fs $syslog
# Required-Stop: $local_fs $syslog
# Default-Start: 2345
# Default-Stop: 90
# Short-Description: run cron daemon
# Description: cron is a standard UNIX program that runs user-specified
# programs at periodic scheduled times. vixie cron adds a
# number of features to the basic UNIX cron, including better
# security and more powerful configuration options.
### END INIT INFO
[ -f /etc/sysconfig/crond ] || {
[ "$1" = "status" ] && exit 4 || exit 6
}
RETVAL=0
prog="crond"
exec=/usr/sbin/crond
lockfile=/var/lock/subsys/crond
config=/etc/sysconfig/crond
# Source function library.
. /etc/rc.d/init.d/functions
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
export TZ=UTC
start() {
if [ $UID -ne 0 ] ; then
echo "User has insufficient privilege."
exit 4
fi
[ -x $exec ] || exit 5
[ -f $config ] || exit 6
echo -n $"Starting $prog: "
daemon $prog $CRONDARGS
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
}
stop() {
if [ $UID -ne 0 ] ; then
echo "User has insufficient privilege."
exit 4
fi
echo -n $"Stopping $prog: "
if [ -n "`pidfileofproc $exec`" ]; then
killproc $exec
RETVAL=3
else
failure $"Stopping $prog"
fi
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
}
restart() {
stop
start
}
reload() {
echo -n $"Reloading $prog: "
if [ -n "`pidfileofproc $exec`" ]; then
killproc $exec -HUP
else
failure $"Reloading $prog"
fi
retval=$?
echo
}
force_reload() {
# new configuration takes effect after restart
restart
}
rh_status() {
# run checks to determine if the service is running or use generic status
status -p /var/run/crond.pid $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac
exit $?
環境変数を設定できます CRON_TZ cronジョブがリモートサーバーで実行されている場合、おそらくcrontabで使用されるシェルはsh。 / etc/crontabを再確認できます。
シェルスクリプトでutc時間を評価するのはどうですか?シェルスクリプトを1時間ごとに実行するようにスケジュールします。スクリプトの上部で、dateコマンドからUTC時間を取得します。希望するUTC時間でない場合は、終了します。
このスクリプトは、午前1時のutcでなければ終了します。
#!/bin/bash
if [ $(date -u +"%H") != "01" ]; then
exit 0
fi
Ubuntu 14/16でこれを理解しました。私にとって完璧に働いた。
ステップ(Sudoが暗示される):
cat /etc/timezone
rm -fv /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Kolkata /etc/localtime
apt install -y --reinstall tzdata
/etc/init.d/rsyslog restart
tail -f /var/log/syslog
cat /etc/timezone