linuxの基礎

linuxの基礎

忘れそうなコマンド類のメモ。

crontabで定期実行する例

指定は分、時、日、月、曜日を指定。

毎日11:00にとあるシェルを動かす場合

00 11 * * * /bin/sh /gvis/script/hogehoge.sh

1月15日と6月15日の11:00にとあるシェルを動かす場合

00 11 15 1,6 * /bin/sh /gvis/script/hogehoge.sh

毎週月曜から金曜の11:00にとあるシェルを動かす場合

00 11 * * 1-5 /bin/sh /gvis/script/hogehoge.sh

5分おきにとあるシェルを動かす場合

*/5 * * * * /bin/sh /gvis/script/hogehoge.sh

crontabのコマンドライン

crontabの登録内容をテキストに書き出して保存。

crontab -l > res.txt

テキストからcrontab登録。

crontab ./res.txt

ほとんど使わないけど、crontabの直接編集。
オッサンはnanoじゃなくviに慣れてるので、いったんテキストファイルをviで編集してからでないと登録しない。

crontab -e

変更前と変更後を維持したいから、直接編集は使わない。
業務利用だったら、diffで比較して差分が必要な箇所だけになってることを確認するのも理由。

ローカルlinuxのcrontab

実際のrootのcrontab設定。
シェルは間違って動くと困るものもあるので、実行権はつけてない。
(dockerのエンジン停止とか困る)
代わりに/bin/shで呼び出す。

ちゃんと書けば、書いておいたタイミングで確実に動いてくれる。

#daily shutdown
59 23 * * *               /bin/sh /gvis/script/901_OSstop.sh > /dev/null
59 11 * * 1-5             /bin/sh /gvis/script/901_OSstop.sh > /dev/null

#Timely procdure
00,10,20,30,40,50 * * * * sync

01,11,21,31,41,51 0-23 * * * /bin/sh /gvis/script/903_ping_kanshi.sh 172.16.17.15 Yamaha_rtx1210 > /dev/null

05,15,25,35,45,55 0-23 * * * /bin/sh /gvis/script/802_CHKdiskStat.sh    > /dev/null
06,16,26,36,46,56 6-21 * * * /bin/sh /gvis/script/803_CHKonlchkStat.sh  > /dev/null
07,17,27,37,47,57 0-23 * * * /bin/sh /gvis/script/804_CHKsyslogStat.sh  > /dev/null
09,19,29,39,49,59 6-23 * * * /bin/sh /gvis/script/805_CHKgavann-it.sh   > /dev/null
### */2               0-23 * * * /bin/sh /gvis/script/808_CHKnetlogStat.sh  > /dev/null
*/2               0-23 * * * /bin/sh /gvis/script/808_CHKnetlogStat2.sh > /dev/null

#monthly GoogleDrive every Weekday
30 9 * * 1-5 /bin/sh /gvis/script/gdr/003_SyncNari.sh > /dev/null

#daily Report
11  5 * * *               /bin/sh /gvis/script/801_daily_report.sh > /dev/null
11 10 * * *               /bin/sh /gvis/script/801_daily_report.sh > /dev/null

#daily rm
00 7 * * *                /bin/find /gvis/ -name ".*DS_Store" -print -exec rm {} ";"
01 7 * * *                /bin/find /gvis/ -name "Thumbs.db"  -print -exec rm {} ";"
02 7 * * *                /bin/find /nari/ -name ".*DS_Store" -print -exec rm {} ";"
03 7 * * *                /bin/find /nari/ -name "Thumbs.db"  -print -exec rm {} ";"

fsckしてからマウント

ディスクの不整合を整えてマウントする。

## -------------------------------------------------------------------------
## Script Name  :
##  Created by  : T.Naritomi
##          on  : 2007.12.21
##  Updated by  :
##          on  :
##  Parameters  :
##  Return Code : 0=Normal End
##     Comments :
## -------------------------------------------------------------------------
## ---detail----------------------------------------------------------------

/sbin/fsck -y /dev/sdb
/sbin/fsck -y /dev/sdb
/sbin/fsck -y /dev/sdb

/sbin/fsck -y /dev/sdc
/sbin/fsck -y /dev/sdc
/sbin/fsck -y /dev/sdc

mount -t ext4 /dev/sdb /docker
mount -t ext4 /dev/sdc /nari 

lnでリンク

windowsでいうとショートカットみたいなもの。
ハードリンクとかもあるらしいけど、-sでシンボリックリンクがあれば十分。

# mkdir test
# cd test
# echo aaa > aaa.txt
# cat aaa.txt
aaa
# ln -s aaa.txt AAA.txt
# ls -l
合計 4
lrwxrwxrwx 1 root root 7  3月  6 04:47 AAA.txt -> aaa.txt
-rw-r--r-- 1 root root 4  3月  6 04:46 aaa.txt
# cat AAA.txt
aaa
#

メール送信

サイトやサービスが停止してたり、ノード停止してたりしないか監視の処理を動かすとき、有事にメールを送る。

centos7/8のときはmailコマンドに”-s”のみで送信できたけど、ubuntu20になったら”-s”がなくなってたので書き改めた。

これ動かすときはpostfixでsmtpサーバとかの設定を先にやっておく必要がある。

MAIL_TO="hogehoge@foo.com"
MAIL_TITLE="auto)BackupCompleteMail-nafsLinux-Home"
START_TIME=`date +%F_%T_`
# Report mail make-----------------------------------------------#
echo    "////// naFSlinux BackupReport start   //////" >> $MAILMSG
echo    "START ---- " ${START_TIME}                    >> $MAILMSG
echo    "////// naFSlinux BackupReport end     //////" >> $MAILMSG

### /bin/mail -s $MAIL_TITLE $MAIL_TO < $MAILMSG
cat $MAILMSG | /usr/bin/mail -a "Content-Type: text/plain; charset=UTF-8" -s $MAIL_TITLE $MAIL_TO

rsyncとtar/zip

rsyncで特定のフォルダを同期バックアップ。
例えばdockerの永続化領域の場合コンテナ停止と起動が最初と最後に来る。

dockerのデータ領域は別パーティションなので”lost+found”を除外。
nariDockerSysにはコンテナが入っているからこれも除外。
nariDockerDatは永続化領域だけど_tmpにテンポラリファイルを入れてることがあるから、これも除外。

永続化領域にはmariadbやnginxのデータが入っていて、ファイルの所有権もコンテナ内の事情でバラバラ。
なので、rootで実行しないとrsyncが読み取れない。

SRC_ROOT1=/docker
BACKUP_DKDR=/nari/GVIS/98_backup/DK_backup
LOG_FILE=/gvis/log/001_sysBackup.log

# stop&reflesh docker containers--------------------------------------------
## docker images -f     dangling=true -q | xargs docker rmi
## docker volume ls -qf dangling=true    | xargs docker volume rm
docker system prune -f --volumes

/bin/sh /gvis/script/301_dockerStop.sh

# backup docker data -------------------------------------------------------
rsync -av --delete --exclude='nariDockerSys/' \
                   --exclude='nariDockerDat/_tmp/' \
                   --exclude='lost+found' \
      ${SRC_ROOT1}/ ${BACKUP_DKDR} >> ${LOG_FILE}

# start docker containers---------------------------------------------------
/bin/sh /gvis/script/302_dockerStart.sh
cd /docker
/bin/sh ./dockerStart.sh

${BACKUP_DKDR}に入ったバックアップはtarで固めて、zipでパスワードかける。
tera termのマクロでバックアップのシェルを呼び出すとき、引数にパスワード渡すようにして呼び出す。tarはシングルコアでしか動かないが、pigzを使うとマルチコアになる。

# make archive file---------------------------------------------------------
cd ${BACKUP_DKDR}
cd ..
### tar czf `basename ${BACKUP_DKDR}`.tar.gz `basename ${BACKUP_DKDR}`  >> ${LOG_FILE}
tar -I pigz -cf `basename ${BACKUP_DKDR}`.tar.gz `basename ${BACKUP_DKDR}`  >> ${LOG_FILE}
zip -r -P $1 `basename ${BACKUP_DKDR}`.zip `basename ${BACKUP_DKDR}`.tar.gz >> ${LOG_FILE}
mv           `basename ${BACKUP_DKDR}`.zip ${BACKUP_ROOT}
rm -f   `basename ${BACKUP_DKDR}`.tar.gz

サービスの起動と停止

dockerやsambaをインストールすると、サービスは自動的に起動するようになってる。

でもOSが起動して、ディスクをマウントして、その後でサービス起動をしたいときのほうが多い。

だから自動的に起動はさせない(唯一macだけは特に何もしてない)。

turbolinux6の頃は、chkconfigで自動起動とかコントロールしてたと思う。メモリがあんまりないときはftpをxinetd経由で使ってた。

solaris8のときは/etc/rc3.dのディレクトリの下に起動と停止のスクリプト書いてた。

最近はcent7やubuntu20使うので、systemctlでコントロールする。

例えばdockerの状態を確認するとき。

# systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
     Active: active (running) since Sat 2021-03-06 03:53:14 JST; 1h 4min ago
       Docs: https://docs.docker.com
   Main PID: 5452 (dockerd)
      Tasks: 46
     Memory: 63.2M
     CGroup: /system.slice/docker.service
             tq5452 /usr/bin/dockerd --containerd=/run/containerd/containerd.sock --data->
             tq5744 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 23389 -c>
             tq5767 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 20022 -c>
             tq5854 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3306 -co>
             mq6160 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 20080 -c>

 3月 06 03:53:14 nafslinux-intra-gavann-it-com systemd[1]: Started Docker Application Con>
 3月 06 03:53:14 nafslinux-intra-gavann-it-com dockerd[5452]: time="2021-03-06T03:53:14.9>
 3月 06 03:53:23 nafslinux-intra-gavann-it-com dockerd[5452]: time="2021-03-06T03:53:23.9>
 3月 06 03:53:23 nafslinux-intra-gavann-it-com dockerd[5452]: time="2021-03-06T03:53:23.9>
 3月 06 03:53:24 nafslinux-intra-gavann-it-com dockerd[5452]: time="2021-03-06T03:53:24.0>
 3月 06 03:53:24 nafslinux-intra-gavann-it-com dockerd[5452]: time="2021-03-06T03:53:24.0>
 3月 06 03:53:24 nafslinux-intra-gavann-it-com dockerd[5452]: time="2021-03-06T03:53:24.1>
 3月 06 03:53:24 nafslinux-intra-gavann-it-com dockerd[5452]: time="2021-03-06T03:53:24.1>
 3月 06 03:53:25 nafslinux-intra-gavann-it-com dockerd[5452]: time="2021-03-06T03:53:25.3>
 3月 06 03:53:25 nafslinux-intra-gavann-it-com dockerd[5452]: time="2021-03-06T03:53:25.3>
lines 1-24/24 (END)

最初のほうに「/lib/systemd/system/docker.service」って書いてある箇所がある。

このファイルが起動設定ファイルで、オプションとか指定できる。内容変更したら、daemon-reloadで設定を反映させる必要がある。

systemctl daemon-reload

起動するときは、

systemctl start docker

停止するときは、

systemctl stop docker

サービスの登録

OS起動のときの自前基礎サービスは以下のとおり。

  1. カーネルが起動
  2. sshとxrdpが起動

その後起動して欲しいのは以下のとおり。

  1. データの入ったディスクパーティションをマウント
  2. samba/apache2を起動
  3. dockerを起動
  4. コンテナを起動(通常分)
    1. centosのxrdp
    2. mariadb
    3. nginx + php7.4

そこで、この起動順位を守らせるために、小さなスクリプトを用意しておいて、サービス登録してしまう。

小さなスクリプトは以下のとおり。
最初のほうにあるexitは普段はコメント化しておき、何か障害が出たときだけコメント外す。

## -------------------------------------------------------------------------
## Script Name  : serviceStart.sh
##  Created by  : T.Naritomi
##          on  : 2019.10.11
##  Updated by  :
##          on  :
##  Parameters  :
##  Return Code : 0=Normal End
##     Comments : for gvis.service before os start (os base process and X11,xrdp,sshd)
##                systemd require /etc/systemd/system/gvis.service
## -------------------------------------------------------------------------
## ---detail----------------------------------------------------------------

### exit

/bin/sh /gvis/script/006_mount_ext4.sh

/bin/sh /gvis/script/proc/syslogchkReset

/bin/sh /gvis/script/102_SambaStart.sh
/bin/sh /gvis/script/202_httpdStart.sh

/bin/sh /gvis/script/302_dockerStart.sh
/bin/sh /docker/dockerStart.sh
root@nafslinux-intra-gavann-it-com:/gvis/script#

自動起動の設定は/etc/systemd/system/gvis.serviceに置く。

[Unit]
Description = gvis daemon

[Service]
ExecStart = /usr/bin/sh /gvis/script/000_serviceStart.sh
Restart = no
Type = simple

[Install]
WantedBy = multi-user.target

こうして置いといた自動起動設定が認識できているか確認。

# systemctl list-unit-files --type=service | grep gvis
gvis.service                               enabled         enabled
#

できてそうなら、サービス有効化

# systemctl enable gvis
# systemctl start gvis

これでOS起動したらシェルが動く。
ついでにサービス状態確認すると、順番に起動して最後にSucceededが見えるのと、シェルは停止したから「Active: inactive (dead)」になってる。

# systemctl status gvis
● gvis.service - gvis daemon
     Loaded: loaded (/etc/systemd/system/gvis.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Sat 2021-03-06 03:41:30 JST; 2h 4min ago
    Process: 782 ExecStart=/usr/bin/sh /gvis/script/000_serviceStart.sh (code=exited, sta>
   Main PID: 782 (code=exited, status=0/SUCCESS)

 3月 06 03:41:24 nafslinux-intra-gavann-it-com sh[2129]: /gvis/script/proc/syslogchk.dat >
 3月 06 03:41:24 nafslinux-intra-gavann-it-com sh[2145]: /gvis/log
 3月 06 03:41:24 nafslinux-intra-gavann-it-com sh[2246]: /gvis/log
 3月 06 03:41:26 nafslinux-intra-gavann-it-com sh[2288]: /gvis/log/300_docker.log
 3月 06 03:41:27 nafslinux-intra-gavann-it-com sh[2914]: Starting docker_sv_mariadb_1 ...
 3月 06 03:41:27 nafslinux-intra-gavann-it-com sh[2914]: Starting docker_sv_php74_1   ...
 3月 06 03:41:27 nafslinux-intra-gavann-it-com sh[2914]: Starting docker_cl_cent7_1   ...
 3月 06 03:41:28 nafslinux-intra-gavann-it-com sh[2914]: [134B blob data]
 3月 06 03:41:30 nafslinux-intra-gavann-it-com sh[2914]: [102B blob data]
 3月 06 03:41:30 nafslinux-intra-gavann-it-com systemd[1]: gvis.service: Succeeded.
lines 1-16/16 (END)

nmonでcpuとかメモリの動作状況確認

昔、業務でibmのサーバ使うことがあった。
そのときにnmonってツールがあって、windowsのタスクマネージャみたいなものが見えてくれてめっちゃ便利。

nmon コマンド

linuxでもないのかなって後になって探したら、centosやubuntuでも使える。

nmon and njmon | Main / HomePage

nmonってコマンドラインで一般ユーザから打っても負荷が見える。
起動したら、普段は「cdm」って順にキーを打つとその負荷を見せてくれる。

docker使うとdfしたときに「/dev/loop」で始まる記述がたくさん出る。
性能見たいときには、あまり必要ない。

「cdm」のあとに「.」(ピリオド)を打つと、busy状態なディスクだけ表示してくれるから、小さなtera termウィンドウでも負荷が見やすい。

tarでアーカイブを作る

$ tar czf memo.tar.gz ./memo
x---------------------------+-------------------------------------------------+
xCPU User%  Sys% Wait%  Idle|0          |25         |50          |75       100|
x  1  46.3  53.7   0.0   0.0|UUUUUUUUUUUUUUUUUUUUUUUssssssssssssssssssssssssss>
x  2   0.0   2.7   0.0  97.3|s                                                >
x  3   0.0   0.5   0.0  99.5|                                                 >
x  4   0.0   0.0   0.0 100.0|                                                 >
x---------------------------+-------------------------------------------------+
xAvg  11.8  14.5   0.0  73.7|UUUUUsssssss                  >                  |
x---------------------------+-------------------------------------------------+

tarでアーカイブを戻す

$ tar xzf memo.tar.gz
x---------------------------+-------------------------------------------------+
xCPU User%  Sys% Wait%  Idle|0          |25         |50          |75       100|
x  1   0.6   1.8   0.0  97.6|                                                 >
x  2   6.5  51.5   0.0  42.0|UUUsssssssssssssssssssssssss                     >
x  3   0.0   1.0   0.0  99.0|                                                 >
x  4   0.0   0.5   0.0  99.5|                                                 >
x---------------------------+-------------------------------------------------+
xAvg   1.7  13.9   0.0  84.4|ssssss                                  >        |
x---------------------------+-------------------------------------------------+

tarで作ったアーカイブで複数のコアを使う方法

$ sudo apt install pigz

※manコマンドで見ると、pigzにはパスワード指定がなさそう。暗号化できんの残念。

tarでpigzを使ってアーカイブを作る

$ tar -I pigz -cf memo.tar.gz ./memo/
x---------------------------+-------------------------------------------------+
xCPU User%  Sys% Wait%  Idle|0          |25         |50          |75       100|
x  1  27.9  53.5   0.0  18.6|UUUUUUUUUUUUUssssssssssssssssssssssssss          >
x  2  49.2  13.6   0.0  37.1|UUUUUUUUUUUUUUUUUUUUUUUUssssss                   >
x  3  54.1  32.4   0.0  13.5|UUUUUUUUUUUUUUUUUUUUUUUUUUUssssssssssssssss      >
x  4  59.3  15.7   0.0  25.0|UUUUUUUUUUUUUUUUUUUUUUUUUUUUUsssssss             >
x---------------------------+-------------------------------------------------+
xAvg  51.4  22.1   0.0  26.5|UUUUUUUUUUUUUUUUUUUUUUUUUsssssssssss             >
x---------------------------+-------------------------------------------------+

tarでpigzを使ってアーカイブを戻す

$ tar -I pigz -xf memo.tar.gz
x---------------------------+-------------------------------------------------+
xCPU User%  Sys% Wait%  Idle|0          |25         |50          |75       100|
x  1   0.0  31.4   0.0  68.6|sssssssssssssss                                  >
x  2   3.3  42.1   2.0  52.6|Usssssssssssssssssssss                           >
x  3   1.1  10.9   0.0  88.0|sssss                                            >
x  4   2.9  39.4   0.0  57.7|Usssssssssssssssssss                             >
x---------------------------+-------------------------------------------------+
xAvg   1.8  30.3   0.5  67.4|sssssssssssssss                                  >
x---------------------------+-------------------------------------------------+

パスワード文字列の作り方

$ sudo apt install pwgen

「パスワード長32文字で、最低1文字の大文字(-c)と数値(-n)を含め1個だけ出力」という場合

$ pwgen -c -n 32 1
$ lushei9eephay0iem7chei2Ahch9uohe

「パスワード長は8文字で、最低1文字の大文字(-c)と数値(-n)、記号(-y)を含め、紛らわしい文字(-B)は含めないように1個だけ出力」という場合

$ pwgen -c -n -y -B 32 1
$ je3aeng3eef3eo7paju%m]aiTh:ah:qu

zip書庫でパスワード指定して圧縮の方法

zip -r -P password memo.zip memo.tar.gz

zip書庫でパスワード指定して解凍の方法

unzip -P password memo.zip
タイトルとURLをコピーしました