技術者になりたい何か

技術者になりたい何かの覚書的な何かです

rsyslogのローテートを設定する

やること

rsyslogでローテート設定

状況

t-min.hatenablog.com

上記のときに設定したDHCPサーバのログがローテートされてない。ので一つのファイルにひたすらログ出力されていた。

使ってるのはisc-dhcp-server。
dhcpd.confでファシリティを7に設定→rsyslog.confでファシリティ7のログを/var/log/dhcp.logとして出力するように設定。

/etc/dhcp/dhcpd.confの該当箇所

authoritative;
log-facility local7;

/etc/rsyslog.confの該当箇所

※syslogに出力しない

*.*;auth,authpriv.none;local7.none		-/var/log/syslog

※messagesに出力しない

*.=info;*.=notice;*.=warn;\
	auth,authpriv.none;\
	cron,daemon.none;\
	mail,news.none;local7.none	-/var/log/messages

※/var/log/dhcp.logに出力

# isc-dhcp-server
local7.* /var/log/dhcpd.log

ある日なんとなく/var/logを眺めていると

dhcpd.logが一つしかないです。他のは番号付きでローテートされてるのに。
やな予感がして行数。

$ cat /var/log/dhcpd.log | wc -l
2862889

ちょっと!!

というわけでローテートの設定します。
rsyslogのローテート設定は/etc/logrotate.conf と /etc/logrotate.d/rsyslog。
デフォルトで勝手に専用ファイル作られるのもいくつかあります。

 ls /etc/logrotate.d
apache2  apt  cups-daemon  dpkg  exim4-base  exim4-paniclog  minidlna  mysql-server  nginx  pure-ftpd-common  rkhunter	rsyslog   samba  squid  vsftpd

/etc/etc/logrotate.d/rsyslog に定義を書いてあげれば、rsyslogでログ出力制御しているものは記述に従ってローテーとしてくれます。
今回はローテートに特にこだわりはないので(日付つけて毎日ローテとか別にしない)普通にsyslogなんかと合わせてローテさせます。
/etc/logrotate.d/rsyslog

/var/log/syslog
/var/log/iptables
/var/log/dhcpd.log ## ここ書き加え
{
	rotate 30
	daily
	missingok
	notifempty
	delaycompress
	compress
	postrotate
		invoke-rc.d rsyslog rotate > /dev/null
	endscript
}

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
	rotate 30
	weekly
	missingok
	notifempty
	compress
	delaycompress
	sharedscripts
	postrotate
		invoke-rc.d rsyslog rotate > /dev/null
	endscript
}

これで毎日ローテ、30世代までとっとく、2個前のログは圧縮という動きをしてくれるはず。

設定できたら手動で強制ローテ

rsyslog再起動

$ sudo systemctl restart rsyslog

手動ローテ

$ sudo logrotate -f /etc/logrotate.conf

これで定義されてる全ログローテが手動実行のタイミングで行われます。
今回はdhcpd.logがちゃんとローテされていればおk。

このコマンドだと他のログも全部ローテされてしまうのがビミョーなとこですね。
一回設定ファイルでローテさせたくないログはコメントアウトしてから手動ローテかけて、その後にコメントアウト解除すれば大丈夫です。ちょっとめんどいですが。

conkyでCPUのコアごとのクロックを表示する

conkyとは

デスクトップに常に表示できるシステムモニター。

とはいえ単純にシステムモニタだけでなく、メディアと連動させたり天気予報やRSSフィード、メールなどと連動もできるすごい高機能なやつ。

wiki.archlinux.jp

設定は~/.conkyrcに記述するんだけど、かなりめんどいのでなにかベースをいじっていくのがよさげ。

 

conkyのCPUクロック表示をコアごとにしたい

僕が使ってるconkyは10年位前に設定ファイル作って、なにか変更するたびにちょいちょい設定ファイル書き換えたりして使ってきた盆栽のようなやつなのですが、CPUのクロック表示がコアごとになってなかったのです。

そもそも最初に設定作ったときはAthlon 64 x2だったので、クロック変動はCPU全体だったのですね。その後いろいろ構成変えたときに設定ファイルはいじったものの、どうやらコアごとのクロックは拾ってくれてませんでした。

 

これを解決。

askubuntu.com

もとの記述

 

Core1:$alignr ${cpu cpu1}%@${freq_g cpu1}GHz ${color #4B625A}${cpubar cpu1 7,76} ${color black}
Core2:$alignr ${cpu cpu2}%@${freq_g cpu2}GHz ${color #4B625A}${cpubar cpu2 7,76} ${color black}
Core3:$alignr ${cpu cpu3}%@${freq_g cpu3}GHz ${color #4B625A}${cpubar cpu3 7,76} ${color black}
Core4:$alignr ${cpu cpu4}%@${freq_g cp43}GHz ${color #4B625A}${cpubar cpu4 7,76} ${color black}
Core5:$alignr ${cpu cpu5}%@${freq_g cpu5}GHz ${color #4B625A}${cpubar cpu5 7,76} ${color black}
Core6:$alignr ${cpu cpu6}%@${freq_g cpu6}GHz ${color #4B625A}${cpubar cpu6 7,76} ${color black}
Core7:$alignr ${cpu cpu7}%@${freq_g cpu7}GHz ${color #4B625A}${cpubar cpu7 7,76} ${color black}
Core8:$alignr ${cpu cpu8}%@${freq_g cpu8}GHz ${color #4B625A}${cpubar cpu8 7,76} ${color black}

 

変更後

Core1:$alignr ${cpu cpu1}% @ ${exec awk '/cpu MHz/{i++}i==1{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu1 7,76} ${color black}
Core2:$alignr ${cpu cpu2}% @ ${exec awk '/cpu MHz/{i++}i==2{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu2 7,76} ${color black}
Core3:$alignr ${cpu cpu3}% @ ${exec awk '/cpu MHz/{i++}i==3{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu3 7,76} ${color black}
Core4:$alignr ${cpu cpu4}% @ ${exec awk '/cpu MHz/{i++}i==4{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu4 7,76} ${color black}
Core5:$alignr ${cpu cpu5}% @ ${exec awk '/cpu MHz/{i++}i==5{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu5 7,76} ${color black}
Core6:$alignr ${cpu cpu6}% @ ${exec awk '/cpu MHz/{i++}i==6{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu6 7,76} ${color black}
Core7:$alignr ${cpu cpu7}% @ ${exec awk '/cpu MHz/{i++}i==7{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu7 7,76} ${color black}
Core8:$alignr ${cpu cpu8}% @ ${exec awk '/cpu MHz/{i++}i==8{printf "%.f",$4; exit}' /proc/cpuinfo}MHz ${color #4B625A}${cpubar cpu8 7,76} ${color black}

 

これでコアごとのクロック表示(Mhz)が可能に。

 

仕組み

仕組みは簡単で、/proc/cpuinfoからcpu Mhzの行を取得して整形しているだけですね。

 

[tmin@tmin_Arch ~]$ cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 23
model : 1
model name : AMD Ryzen 5 1500X Quad-Core Processor
stepping : 1
microcode : 0x8001137
cpu MHz : 2868.184
cache size : 512 KB
physical id : 0
siblings : 8
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate sme ssbd sev ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 xsaves clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca
bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 6988.16
TLB size : 2560 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 43 bits physical, 48 bits virtual
power management: ts ttp tm hwpstate eff_freq_ro [13] [14]
~~以下略〜〜

 

ちなみにlua構文

いつの間にかconkyのバージョンが変わってlua構文になっていました。

自力で書き直そうとしたけどめんどくさかったので、スクリプト使いました。

github.com

Usage: convert.lua old_conkyrc [new_conkyrc]

とあるように、もとの.conkyrcをスクリプトに読ませればおk。

 

cronでn秒おきに実行するジョブを中途半端な一定期間だけ走らせたい

お題
cronで秒単位で実行しているコマンドを、任意の時間帯だけ走らせたい。
21:50-22:40,22:50-23:40の50mx2の間だけ、n秒おきにとある情報を取るコマンドを走らせたい。

というのを少し苦労したけど、実行ユーザのcronをrootのcronで置き換えるという力業(?)でなんとかできました。

■crontabの基本的な使い方

$ crontab -l

内容表示

$ crontab -e

内容編集

$ crontab -r

内容削除
オプションで - u username をつけるとそのユーザのcronを編集できる。-uつけない場合は現在のユーザのcronに対する操作になる。

ちなみにeとrはキーが隣り合っているため、操作ミスで削除してしまわないようにcrontab -eで編集はしないように、とかエイリアスでcrontab -rを置き換えたり無効にしたりするべきという議論があるけど、ここでは触れない。
自分としては編集前に必ずcrontab -lをしておくことで、間違えて消してしまった場合にすぐ復旧できるようにしておけば良いような気がしているし、実際そうしている。

cronのファイル自体は/var/spool/cron 配下にユーザ名でおいてある(RedHat 7系の場合)ので、そのファイル自体を編集するという手もある。

■crontabの書き方

設定項目は左から「分」「時」「日」「月」「曜日」

* * * * * [実行コマンド]

曜日については0-7で、0も7も日曜日。
リストでの書き方 0,10,20,30 分フィールドの場合0,10,20,30分に実行する
範囲での書き方 1-5 時間フィールドの場合1,2,3,4,5時に実行する。
間隔を指定する */10 分フィールドの場合、10分おきに実行する。

上記のように、デフォルトでは分が最小単位のため、秒指定の実行はできない。
そこでn秒おきに実行するためによく使われるのが、 seq コマンドを使ってfor文を回し、sleepコマンドを使用するもの。

10秒おきの場合はこのように。

* * * * * for i in `seq 0 10 59`;do (sleep ${i}; コマンド) & done;

seqコマンドの動きはこのような感じ。

$ seq 0 10 59
0
10
20
30
40
50
$ 

上記の場合、0~59の範囲内で10個おきに番号を取得するため、出力としては0,10,20,30,40,50となる。
これを変数iに入れて、sleep $i すると、

sleep 0 実行コマンド
sleep 10 実行コマンド
sleep 20 実行コマンド
sleep 30 実行コマンド
sleep 40 実行コマンド
sleep 50 実行コマンド

となるので、10秒おきに実行が実現できる。
これを毎分実行するので、毎分00秒になったらseq でsleepする秒を取得し、sleepしてから指定コマンドを実行となる。

■本題-n秒おきに実行するコマンドを、指定時間内だけ実行したい。

ここから本題。
切りの良い時間(1-3時)とか、特定日だけとかなら時間フィールド、日フィールドの記述でなんとかなりそうだし、
張り付いていられる時間なら指定時間にコメントアウトを解除、再度コメントアウトで行けそうだけども。

ちなみに今回のお題は、21:50-22:40,22:50-23:40と非常に中途半端な時間が2回という残念な感じ。

それからどうした

幸いなことにこのcronを実行するのはとある一般ユーザだったので、rootのcronで指定時間にhogeのcronを書き換え、指定時間に書き戻すことで対応できました。

具体的には

1.n秒おきに実行する行を書き加えたcrontab(10s_cron)と、もとのままのcrontab(default_cron)をどこか(/home/tmin/cron)においておく。
$ ls -l /home/tmin/cron
10s_cron
default_cron
2.rootのcronで予め用意したcronを指定時間に書き換え、指定時間に書き戻し。
50 21 * * * cp -p /home/tmin/cron/10s_cron /var/spool/cron/tmin
40 22 * * * cp -p /home/tmin/cron/default_cron /var/spool/cron/tmin
50 22 * * * cp -p /home/tmin/cron/10s_cron /var/spool/cron/tmin
40 23 * * * cp -p /home/tmin/cron/default_cron /var/spool/cron/tmin

結果的にうまく行きました!!

ちなみにrootのcronで/var/spool/cron/root自体を書き換えられるかは未検証。
よくよく考えたらsed置換とかでも良かったよね。

なんとなくもっとスマートなやり方はあるような気がします。

Sponsored Link