web-dev-qa-db-ja.com

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

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

どうやってやるの?

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

TZ="UTC"

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

何か案は?

63
alj

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

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

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

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

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

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

18
Cookie

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

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

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

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

13
Keith Shaw

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

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

13

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
7
James Parks
  1. /etc/default/cronを参照してください。ここで-all- crontabsのTZを設定できます。TZ=UTC iircにする必要があります。したがって、メソッドは機能しているはずです。

  2. fcron をご覧ください。異なるタイムゾーンで個別のcrontabを設定できます:

    timezone-name 'time zone of the system'

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

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

5
Rinzwind

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 $?
4
James Parks

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

0
PT Huynh

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

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

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

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
Varun Chandak