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の記述とかぶるので、割愛
注意
時刻を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分単位でしか起動できなく、また祝日判定などこった指定はできない
- 登録した時間にマシンが起動していないと、起動されない
- 処理が異常終了した際にこったリカバリ作業はできない