crontabのタイムゾーンはどのように設定しますか?


63

ACPIウェイクアップをセットアップして、ラップトップが毎朝特定の時間にウェイクアップするようにしました。これのタイムゾーンはUTCです。UTCを使用してcrontabもセットアップし、ウェイクアップアラームに適合するようにします。

どうやってやるの?

/etc/default/cronを含めるように編集しようとしました:

TZ="UTC"

しかし、それは機能しません。(私も試してみたTZ=UTCTZ="UTC/GMT"

何か案は?


1
あなたがやったのsudo service cron restart編集後?
リンツウィンド

1
いいえ...しかし、私はそれを試してみましたが、違いはありませんでした。
-alj


回答:


44

Trusty(14.04)でも同様の問題がありました。マシンのタイムゾーンを設定してからcronサービスを再起動することで解決しました

  1. sudo dpkg-reconfigure tzdata -指示に従って地域/国を選択します
  2. sudo service cron restart

1
タイムゾーンを設定したらdate、コマンドラインに入力して、期待どおりに日付が正しいことを確認できます。
mydoghasworms

cronを再起動しましたが、まだ古いタイムゾーン(UTC)を使用していますか?
ルークフィスクレノン

これは、18.10でシームレスに機能しました。〜$ dateは正しい時刻を返します。これらの明るい色のDOSスタイルのGUIインターフェイスが大好きになりました!ありがとう。
トリッキーな

18

これを達成する簡単な方法はありません。cronは現地時間を使用します。crontabの/etc/default/cron他のTZ仕様は、TZcronによって開始されるプロセスに使用するものを指定するだけで、開始時間には影響しません。

私が見たほとんどのソリューションは中間のユーティリティを含むため、cronはUTCで開始するタイミングを決定する何かを開始します(たとえば、DSTの変更のみを懸念している場合、2時間前に開始し、計算します時間差、およびそれをキックオフ。を見てくださいat。そうするために、人々は頻繁に使用するperlpython)または同様のスクリプト言語。

あなたが望むなら、それをハックする厄介な方法があります。cronは、起動時にシステムからTZ情報のみを読み取ります。したがって、これが常に実行されているサーバーである場合は、TZをUTCに設定して再起動し、起動後にローカルタイムゾーンに設定することができます。これもスクリプト化できます。

別のアプローチとして、@rebootcron の構文も参照してください。これは、起動後にスクリプトを実行する必要があります。


14

システムのタイムゾーンを制御するファイルがあります。同じ問題が発生しました。解決策を次に示します。

タイムゾーンを手動で設定していない場合、実行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変数の設定は一時的な解決策であり、「マスク」として機能する場合があります。


1
CentOS互換ソリューション(およびEC2 Amazon Linux)の場合は+1。完全な再起動は良いアイデアかもしれませんが、私にとってdateは再起動せずに作業しました。OSの再起動はsudo service crond restartcronジョブ時間を修正するのに十分でした。
ダヴール

+1ありがとうございます。
ジム

13

2017年3月の時点で、crondは各crontabでCRON_TZ変数をサポートしていることを発見しました。

CRON_TZ変数は、cronテーブルに固有のタイムゾーンを指定します。ユーザーは、指定されたタイムゾーンに従って時間をテーブルに入力する必要があります。ログファイルへの書き込みに使用される時間は、デーモンが実行されているローカルタイムゾーンから取得されます。

— crontab(5)のマニュアルページからの引用

これにより、各cronジョブをローカル時間で実行する時間を指定でき、サーバーはUTCのままで、DSTを自動的に計上しました。


また、このリンクが役立つことがわかりました:serverfault.com/questions/848829/…。タイムゾーンオプションを見つけるには、オプションを表示するために入力ls /usr/share/zoneinfo/Americaする必要がありました。
cheevahagadog

7

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

1
2つの場所でTZ = UTCを設定する意味は何ですか?crontabファイルに入れることはできませんか?
フオングエン

いいえ。crontabファイルにTZ = UTCを指定すると、cronジョブに対してのみ設定され、cron自体には設定されません。ジョブ実行のタイミングには影響しません。
マークリード

5
  1. をご覧ください/etc/default/cronTZここで-all- crontabsを設定でき、iircになりTZ=UTCます。したがって、メソッドは機能するはずです。

  2. 見ていfcronをします。異なるタイムゾーンで個々のcrontabを設定できます:

    timezone-name 'time zone of the system'

    指定されたタイムゾーンでジョブを実行します。timezone-nameは、環境変数TZに有効な文字列です。詳細については、システムのドキュメントを参照してください。たとえば、「Europe / Paris」はLinuxシステムで有効です。このオプションは、夏時間の変更を正しく処理します。このオプションを定義するジョブが実行されると、TZ環境変数はタイムゾーンの値に設定されます。

    誤ったtimezone-name引数を指定した場合、それは黙って無視され、ジョブはシステムのタイムゾーンで実行されることに注意してください。


さて、私はそれをチェックし、トリガー時間をローカル時間として設定した場合にのみcrontabが機能します。時刻をUTCに設定しても機能しません。
-alj

ウェル4年後、私は、/ etc /デフォルト/のcronでファイルの覗き見を有しており、これは正式に廃止された
the0ther

4年後のダウン投票?はい、これは現在無効ですが、その日には戻っていませんでした。再び、ユーザー11.04であるユーザーはいなくなりました。
リンツウィンド

3
この回答が無効な場合は、おそらく削除する必要があります。StackExchangeで誤った情報を故意に保持しても意味がありません。その使用はかなり無関係な正しい情報の検索でこのページを訪れる誰にでもあるのトピックおよび/または正しいことを。
Quuxplusone

4

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 $?

0

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

0

シェルスクリプトでutc時間を評価するのはどうですか?シェルスクリプトを1時間ごとに実行するようにスケジュールします。スクリプトの上部で、dateコマンドからUTC時間を取得します。希望するUTC時間でない場合は、終了します。

このスクリプトは、午前1時のutcでなければ終了します。

#!/bin/bash
if [ $(date -u +"%H") != "01" ]; then
 exit 0
fi

0

環境変数CRON_TZを設定できます cronジョブがリモートサーバーで実行される場合、おそらくcrontabで使用されるシェルがshであることに気付くはずです。/ etc / crontabを再確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.