[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:26559] adjtimex で時間調整



佐野@浜松です。

今日ちょっと PC の時間を調整していて、計算が面倒になったので
添付のようなスクリプトを作ってみました。

ntp 使って時刻合わせしてる人には無用なものですが、CMOS クロックと
システムクロックでいいかげんに合わせていて、たまに大きくずれると
調整してみるという私のような人間にはあると便利かもというものです。

用途は date で出力される時刻と現在時刻がズレている場合に adjtimex を
使って徐々に調整していくこと、使い方は

 timeadjust.pl <adjust_minutees>

で引数に調整したい時間を分単位で指定します。マイナスの場合はシステムの
時計が遅れていき、プラスの場合は進んでいくはずです。

当然ですが無保証です。あと root 権限が必要です。

 -- timeadjust.pl --
#! /usr/bin/perl
require 5.004;
use strict;
use IO::File;

my $ADJTIMEX = /sbin/adjtimex;
my $GREP = /bin/grep;
my $DATE = /bin/date;
my $AT = /usr/bin/at;

main();

sub main() {

	my $ADJ;
	my $RESET;
	my $TICK;
	my $TIMEX;
	my $TIMEXP;
	my $ATCOM;
	my $fh = new IO::File;

	if (!defined $ARGV[0]) {
                print "usage: timeadjust.pl  adjust_minutes\n";
                print " if adjust_minutes is positive, ";
                print "then clock will speed up.\n";
                print " if adjust_minutes is negative, ";
                print "then clock will slow down.\n";
                exit 1;
        }

	$ADJ = getnum($ARGV[0]);
	if (!defined $ADJ) {
		print " Please set numeric argument\n";
		print " Invalid argument [" . $ARGV[0] . "]\n";
		exit 1;
	}

	$RESET = $ADJ * 10;

	if ($ADJ < 0) {
		$TICK = 9000;
		$RESET = abs $RESET;
	} else {
		$TICK = 11000;
	}

	$TIMEX = $ADJTIMEX . " --tick " . $TICK;
	$TIMEXP = $ADJTIMEX . " -p|" . $GREP . " tick";
	printf "use \"%s\" ", $TIMEX;
	$ATCOM = $AT . " now + " . $RESET . " minutes";
	printf "and \"%s\" ", $ATCOM;
	print "with " . $ADJTIMEX . " --tick 10010\n";

	system($TIMEXP);
        system($TIMEX);
	system($TIMEXP);

	$fh = new IO::File "|$ATCOM";
	print $fh $TIMEXP . "\n";
#	print $fh $ADJTIMEX . " --tick 10010\n";
	print $fh "/etc/init.d/adjtimex start\n";
	print $fh $DATE . "\n";
	print $fh $TIMEXP . "\n";
        $fh->close;

	exit 0;
}


sub getnum($) {
    use POSIX qw(strtod);
    my ($str) = @_;
    $str =~ s/^\s+//;
    $str =~ s/\s+$//;
    $! = 0;
    my($num, $unparsed) = strtod($str);
    if (($str eq '') || ($unparsed != 0) || $!) {
        return undef;
    } else {
        return $num;
    }
}
 

-- 
     # (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
    <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)