非エンジニアのエンジニア道

非エンジニアからエンジニアに転向!その勉強の軌跡を載せていきます。

Linuxの時刻について

2種類の時刻について

UTC(Coordinated Universal Time:協定世界時)
原子時計を基に定められた世界共通の標準時で、天体観測を基にしたGMT(グリニッジ標準時)とほぼ同じ


ローカルタイム
国や地域に共通の地域標準時であり、日本の場合はJST(Japan Standard Time:日本標準時)
UTCとJSTでは9時間の時差がある(JSTがUTCより9時間進んでいる)

時計について

Linuxシステムには主要な時計が2つ存在する。


ハードウェアクロック
BIOS側で設定されている
CPU内部で動作しているすべてのコントロールプログラムから独立しており、マシンの電源が OFF のときにも動作する。


システムクロック
OS側で設定されている
Linuxカーネルの内部に存在している時計。タイマー割り込みによって駆動されているため、Linuxが起動している間しか動作しない。


Linuxではシステムクロックがすべての基準となる時計。
ハードウェアクロックの基本的な役割は、システムが動いていない間にも時計を動かしつづけること。
Linuxシステムは起動時に一度だけハードウェアクロックを参照し、システムクロックを設定する。
その後はハードウェア・クロックは用いない。

hwclock

ハードウェアクロックの読み取りとハードウェアクロックとシステムクロックの同期を行う

オプション

オプションなし 現在のハードウェア時刻を表示する
--hctosys ハードウェアクロックをシステムクロックに設定
--systohc システムクロックをハードウェアクロックに設定
--debug 詳細表示する

date

システムクロックを表示する。

+書式

で指定した形式で表示できる


スーパーユーザーは、-sで時刻を変更することができる

ntpdate

指定されたNTPサーバーに対し時刻を問い合わせ、その時間をシステムクロックに設定する。
ntpdが稼働していると、ntpdateは使えなくなる

オプション

-q NTPサーバーへ時刻の問い合わせのみを行い、 システムクロックの時刻は変更はしない
-s 実行結果をsyslogに出力する

syslogについて

/etc/syslog.confに記載されているとおり、/var/log/messagesに出力される

ntpd

昔書いたので、補足。

ntp.confについて

記載 内容
restrict ACLの指定
server 参照クロックのアドレスを指定
fudge クロックドライバについてのstratumなどの追加情報を指定
driftfile NTPサーバの参照時刻からのインターバルタイマーの発振周波数のずれ(drift)をPPM(parts-per-million:0.0001%)単位で記録するファイル

シェルスクリプト(cron)

大変!久しく書いてなかったようです!!
ちゃんと書かねば・・・と思いつつ。

cronとは

Linuxの内蔵時計によって、指定された時間に指定のコマンドを実行するためのシステム
実際に使用するには、crontabコマンドかatコマンドで時間とコマンドを設定する。
crontabは定期的に実行させたい場合、 atは1回だけ実行させたい場合に使用する。

実行準備

crond が起動していなくてはいけない。


と思ったら、そもそも入ってなかった

# yum -y install vixie-cron


crond の状態を確認

# /etc/init.d/crond status

実行していたら、crond (pid XXXX) を実行中... と表示される


見てみたら、停止してたので起動

# /etc/init.d/croud start

他の説明は、crontabの記述とかぶるので、割愛

注意

  • コマンド実行やディレクトリ指定は絶対パスを指定する
  • 使用できない場合は、cdで明示的にカレントディレクトリを移動する
  • 実行権限があるか確認する(ファイルのパーミッションを確認)
  • 改行コードをLFにする

時刻をcronで

例としてやってみた。
※ntpdをdaemonとして起動している場合には、使えない

準備

# which ntpdate  パスを調べる
# which hwclock  パスを調べる
# cd /root
# mkdir cron
# cd cron

ファイル編集

# vi /root/cron/ntp.sh

#!/bin/sh
/usr/sbin/ntpdate ntp.nc.u-tokyo.ac.jp 
/usr/sbin/hwclock --systohc

# chmod u+x ntp.sh

権限も変更する

cron登録と確認

# crontab -e

# 0 0 * * * /root/cron/ntp.sh > dev/null 2>&1

# crontab -l 


と登録したものの、動いてるかわかんなかったので、
ログがでるようにしてテスト。(実際は毎分にして試しました)

# 0 0 * * * /root/cron/ntp.sh >> /var/log/ntp/cron.log 2>&1


無事該当ファイルに書き込まれてました!

というわけで、時刻についてそもそも詳しく書いてなかったので、
次回書く。

シェルスクリプト(Bash)

shでやってたので、bashについて書く。
おそらく違う部分をメインで

1行目

#!/bin/bash

変数

declare -i a
a=1
echo $a
unset a

変数は基本的に文字列として扱われる
数値とする場合、declareで指定する必要がある
変数の開放はunset

変数宣言

declareを使って、明確に宣言できる

オプション
a 配列
f 変数を関数として扱う
F 関数定義の表示を抑制し,関数名と属性のみを表示する.-Fを指定すると-fも指定したことになる
i 整数。算術式を評価するようになる
r 読み込み専用変数。値の代入、unsetできない
x エクスポート
p 属性と値を表示

二重括弧による計算

a=10
b=2

c=$(($a + $b))
echo "a + b = $c"

c=$(($a - $b))
echo "a - b = $c"

c=$(($a * $b))
echo "a * b = $c"

c=$(($a / $b))
echo "a / b = $c"

配列

array[0]=1
echo ${array[0]}
echo $array

0番目の要素に限り、ブラケットとインデックスが不要
変数の開放はunset


array=(1 2 3 4 5)
echo ${array[*]}

echo ${#array[@]}

まとめて代入、表示できる。
#を頭につけて@で個数を表示する

for

for(( i=1; i <=10; i++ )){
    ((sum+=i))
}
echo $sum

いつものfor文が使える。

シェルスクリプト基本3

他にもあったので追加。

関数内ローカル変数

func2(){
    local str=あああ
    str2=いいい
    echo $str
}
func2
echo $str
echo $str2

localで指定すると関数内で有効なローカル変数となる

select

select value in a b c d e
do
    echo $value
    if [ $value = "e" ]
    then
        break
    fi
done

番号を入力すると、該当するリストの値が格納される

AND、OR演算子の例

[ $# -ne 0 ] || echo "引数がない"
[ $# -eq 0 ] && echo "引数がない"

前者は、式が偽ならコマンドが実行
後者は式が真なら実行される

シェルスクリプト基本2

前回の続き。基本のこと。

シェル変数

あらかじめシェルが定義している変数
setコマンドで一覧を表示

環境変数

各ユーザごとに設定されている変数。子のシェルに引き継ぐ
exportコマンドで一覧を表示

実行

.shのファイルを実行するには、ファイルに実行権限を付与する

# chmod u+x hoge.sh

クォート

ダブルクォート

パラメータ展開とコマンド置換を行う。

シングルクォート

囲まれた文字列は全て展開されず、文字そのものとなる。

バックスラッシュ

次の文字は連解されずに、文字そのものとなる。

バッククォート

コマンド実行された結果に置き換わる。

関数

check()
{
    if [ $1 -gt $2 ]
    then
        return 1
    elif [ $1 -lt $2 ]
    then
        return 2
    else
        return 0
    fi
}
check $1 $2
ret=$?
echo $ret

関数へは、引数はスペースで区切って渡す。
関数内で参照する場合、同じく1 2と使う
returnの引数に指定できる値は、1~255の正の整数のみ

オプション

while getopts l:n: opt
do
    case $opt in
        l)
            FLG_L=$OPTARG
            ;;
        n)
            FLG_N=$OPTARG
            ;;
    esac
done

if [ -n "$FLG_L" ]
then
    echo "-l $FLG_L"
fi

if [ -n "$FLG_N" ]
then
    echo "-n $FLG_N"
fi

オプションを利用して引数を渡す



次はbashとshの比較まわりでも書いてみる。

シェルスクリプト基本

ざっくり基本編ということで。
関数とか続きは、次回へ。

シェルスクリプト

複数の処理をまとめて行う(バッチ処理)ときに使われる、OSのシェルが直接解釈・処理できるスクリプト。
シェルとは、ユーザの操作を受け付けて、与えられた指示をOSの中核部分に伝えるソフトウェア。

基本

#! /bin/sh

1行目に書く


PARAM="string"
echo $PARAM
echo "PARAM ${PARAM}"

変数代入、参照
変数をセットする際に=の前後にはスペースをいれてはいけない


echo `date '+%Y-%m-%d'`

コマンドの場合、``で囲む


$#   引数の個数
$@   全引数リスト
$?   最後に実行したコマンドの戻り値
$0   ファイル名
$1~  第1引数~の値

特殊な変数


echo "a = `expr 5 + 5`"

計算する場合、exprコマンドを使用する


制御構造

if [ 条件式1 ]
then
     条件式1が真の時の処理
elif [ 条件式2 ]
then
     条件式2が真の時の処理
else
     すべての条件式が偽の時の処理
fi

[]の前後に半角スペースを入れる


case $a in
     *.txt)
          echo "テキストです"
          ;;
     *)
          echo "知らない"
          ;;
esac

;;でcase文を抜ける


for var in a b c
do
    echo $var
done

リストに対しての繰り返し


while [ 条件 ]
do
     コマンド
done

条件が真の場合、繰り返す


count=11
until [ $count -eq 0 ]
do
    count=`expr $count - 1`

    if [ `expr $count % 2` -ne 0 ]
    then
        continue 2
    else
        echo $count
    fi

    if [ $count -eq 4 ]
    then
        break 1
    fi
done

条件が偽の場合、繰り返す。continueとbreakも追加

比較

if文やwhile文などで使う


数値評価演算子 真になる場合
$a -eq $b 等しい
$a -ne $b 異なる
$a -gt $b $aより$bが大きい
$a -lt $b $aより$bが小さい
$a -ge $b $aが$bより大きいか等しい
$a -le $b $aが$bより小さいか等しい
文字列評価演算子 真になる場合
$s 長さが0より大きい
! $s 長さが0
$s = $t 等しい
$s != $t 等しくない
論理結合演算子 真になる場合
! hoge hogeが偽
hoge -a fuga hogeとfugaが真
hoge -o fuga hogeもしくはfugaが真
ファイルチェック演算子 真になる場合
-d $a ディレクトリ名
-f $a ファイル名
-L $a シンボリック
-r $a 読み取り可能ファイル
-w $a 書き込み可能ファイル
-x $a 実行可能ファイル
-s $a サイズが0より大きい
$a -nt $b $aが$bより新しい
$a -ot $b $aが$bより古い

勉強やりかけのものも、進めなければ…。

linuxコマンド jobコントロール系

まとめてみた

fg

バックグラウンドで実行しているジョブをフォアグラウンドに切り替える。
バックグラウンドでジョブを実行するには、コマンドの後に&を入力する。

fg ジョブ番号

bg

ジョブをバックグランドで実行する

bg ジョブ番号

at

指定時刻にジョブを自動実行する
ファイルを指定しないと、標準入力でコマンドを指定。Ctrl+Dで決定

at -l         # 一覧表示
at -f ls.sh 18:00   # ファイル内のコマンドを18時に実行
at -d 6        # 指定したジョブ削除

jobs

バックグランドジョブまたは、または停止中のジョブを表示する。
バックグランドジョブのジョブ番号、ジョブの状態、ジョブの名称の一覧を表示する。

jobs

atq

at、batch、crontabコマンドを実行してスケジュールされたジョブを一覧表示する

atq

atrm

at、batch、crontabコマンドを実行してスケジュールされたジョブを削除する
一般ユーザーは自分が実行したもののみ、削除できる

atrm ジョブ番号

batch

システム負荷を見ながらジョブを自動実行する
atコマンドとの違いは、指定時刻になった時に無条件にジョブが実行されるのではなく、システムの負荷が特定の値以下になるまで待機してからジョブを実行する点

batch -f ls.sh 18:00   # ファイル内のコマンドを18時に実行

nohup

ハングアップに反応しないようにしてコマンドを実行する(ログアウトしても処理を中断させない )
HUPシグナルを無視するようにプログラムを実行
ハングアップとは、動作していたソフトウェアが停止し、コンピュータが操作を受け付けなくなる現象や状態のこと

nohup ls.sh &   # バックグラウンドでls.shを実行

stop

バックグランドのジョブを中断する

stop ジョブ番号

crontab

指定日時にジョブを繰り返し実行する
cron を使用するためにはcrondというデーモンが起動している必要がある

crontab -l    # cronの内容を表示する
crontab -e    # cronを編集する
crontab -r    # cronをすべて削除する

設定ファイル

crond は、毎分、以下の設定ファイルの内容に変更がないかを確認し、変更があった場合には、それを反映して実行する。

ディレクトリ名 内容
/var/spool/cron/user ユーザの自動タスク設定ファイル
/etc/crontab 毎時、毎日、毎月、毎週の自動タスクのメイン設定ファイル
/etc/cron.hourly 毎時実行される自動タスク設定ファイルを置くディレクトリ
/etc/cron.daily 毎日実行される自動タスク設定ファイルを置くディレクトリ
/etc/cron.monthly 毎月実行される自動タスク設定ファイルを置くディレクトリ
/etc/cron.weekly 毎週実行される自動タスク設定ファイルを置くディレクトリ
/etc/cron.d 上記以外の自動タスク設定ファイルを置くディレクトリ

書き方

分 時間 日 月 曜日 コマンド名 の順に書く

* * * * * command   # 毎分commandを実行
30 17 25 * * command   # 毎月25日17時30分にcommandを実行
0 12 * * 1 command  # 毎週月曜日12時にcommandを実行

注意点

  • 重複起動防止の機能はなく、個々のプログラムで排他制御をする必要がある
  • 基本1分単位でしか起動できなく、また祝日判定などこった指定はできない
  • 登録した時間にマシンが起動していないと、起動されない
  • 処理が異常終了した際にこったリカバリ作業はできない