ACPIウェイクアップをセットアップして、ラップトップが毎朝特定の時間にウェイクアップするようにしました。これのタイムゾーンはUTCです。UTCを使用してcrontabもセットアップし、ウェイクアップアラームに適合するようにします。
どうやってやるの?
次/etc/default/cron
を含めるように編集しようとしました:
TZ="UTC"
しかし、それは機能しません。(私も試してみたTZ=UTC
とTZ="UTC/GMT"
)
何か案は?
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
date
、コマンドラインに入力して、期待どおりに日付が正しいことを確認できます。
これを達成する簡単な方法はありません。cronは現地時間を使用します。crontabの/etc/default/cron
他のTZ
仕様は、TZ
cronによって開始されるプロセスに使用するものを指定するだけで、開始時間には影響しません。
私が見たほとんどのソリューションは中間のユーティリティを含むため、cronはUTCで開始するタイミングを決定する何かを開始します(たとえば、DSTの変更のみを懸念している場合、2時間前に開始し、計算します時間差、およびそれをキックオフ。を見てくださいat
。そうするために、人々は頻繁に使用するperl
かpython
)または同様のスクリプト言語。
あなたが望むなら、それをハックする厄介な方法があります。cronは、起動時にシステムからTZ情報のみを読み取ります。したがって、これが常に実行されているサーバーである場合は、TZをUTCに設定して再起動し、起動後にローカルタイムゾーンに設定することができます。これもスクリプト化できます。
別のアプローチとして、@reboot
cron の構文も参照してください。これは、起動後にスクリプトを実行する必要があります。
システムのタイムゾーンを制御するファイルがあります。同じ問題が発生しました。解決策を次に示します。
タイムゾーンを手動で設定していない場合、実行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変数の設定は一時的な解決策であり、「マスク」として機能する場合があります。
date
は再起動せずに作業しました。OSの再起動はsudo service crond restart
cronジョブ時間を修正するのに十分でした。
2017年3月の時点で、crondは各crontabでCRON_TZ変数をサポートしていることを発見しました。
CRON_TZ変数は、cronテーブルに固有のタイムゾーンを指定します。ユーザーは、指定されたタイムゾーンに従って時間をテーブルに入力する必要があります。ログファイルへの書き込みに使用される時間は、デーモンが実行されているローカルタイムゾーンから取得されます。
— crontab(5)のマニュアルページからの引用
これにより、各cronジョブをローカル時間で実行する時間を指定でき、サーバーはUTCのままで、DSTを自動的に計上しました。
ls /usr/share/zoneinfo/America
する必要がありました。
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
。TZ
ここで-all- crontabsを設定でき、iircになりTZ=UTC
ます。したがって、メソッドは機能するはずです。
見てい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 $?
シェルスクリプトでutc時間を評価するのはどうですか?シェルスクリプトを1時間ごとに実行するようにスケジュールします。スクリプトの上部で、dateコマンドからUTC時間を取得します。希望するUTC時間でない場合は、終了します。
このスクリプトは、午前1時のutcでなければ終了します。
#!/bin/bash
if [ $(date -u +"%H") != "01" ]; then
exit 0
fi
sudo service cron restart
編集後?