systemdの*.serviceの書き方

ディレクトリ: /etc/systemd/system/*.service

[Unit]
Description=Load dump capture kernel
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/opt/bin/run-kexect.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Unit, Service, Installのセクションから成り立ち、Unit, Installは共通的な設定内容、Serviceはサービスを実行するため

### Unitセクション
Description: ユニットの説明
After/Bifore: 指定したユニットの実行順番。Afiter=bar.serviceの場合、bar.serviceのstart-up処理が終わるまで実行しない
Requires/Wants: ユニットの依存関係の定義 Wants=bar.service など
その他: man 5 systemd.unit

### Serviceセクション
Type: Typeには以下の5つがあり、設定がなければsimpleがデフォルトで使用される
L simple, forking, oneshot, notify, dbus
ExecStart: 実行するコマンドラインを書く
RemainAfterExit: typeがoneshotの場合は、コマンド実行後もステータスをアクティブにする

### Installセクション
WantedBy/RequiredBy: systemctl enable xxxでユニットをenableした時に、.wants, .requiredにシンボリックリンクを作る
/etc/systemd/system/multi-user.target.wants/

なるほど

OSのユーザ作成

$ less /etc/passwd

vagrant:x:1000:1000::/home/vagrant:/bin/bash
ken:x:500:100::/home/ken:/bin/bash

ユーザ名: ken
パスワード: x
ユーザID: 500
グループID: 100
コメント:
ホームディレクトリ: /home/vagrant
ユーザが利用するシェル: /bin/bash

$ sudo useradd -u 2000 -g 2000 -m -s /bin/bash hpscript
-m は ユーザ名でホームディレクトリを作成
$ cat /etc/passwd

パスワード付与
$ sudo passwd hpscript

なるほどー 理解した

OSのグループ、ユーザー

Linuxでは複数のユーザが使用することを想定しているため、グループを作って、一括でまとめて管理できるようにしている。

### グループ一覧の確認
$ cat /etc/group
e.g.
linuxacademy:x:1001:student
グループ名: linuxacademy
パスワード: x(セキュリティ上表示しない)
グループ番号(GID): 1001
所属メンバー一覧: student

### グループを操作
groupaddコマンド: グループを追加
groupmodコマンド: グループを編集
groupdel: グループを削除

### グループにメンバーを追加・解除
usermodコマンド

### ファイルやディレクトリに対してグループのアクセス権を設定
chmodコマンド

### グループ作成
-g: グループIDを指定する
$ sudo groupadd -g 2000 hpscript

なるほどー 実際に手を動かして大分理解した。

EC2 RHEL8にpostgresqlを入れたい

コンソール上でRHEL8のEC2を起動する

$ ssh ec2-user@* -i ~/.ssh/*.pem
$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.5 (Ootpa)

### リポジトリの追加
$ sudo yum -y localinstall https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
$ sudo yum -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

### postgresqlインストール
$ yum install postgresql postgresql-server
– バージョン確認
$ rpm -qa | grep postgres
postgresql-server-10.19-1.module+el8.6.0+13642+78853f5a.x86_64
postgresql-10.19-1.module+el8.6.0+13642+78853f5a.x86_64
– アカウントが作成されていることを確認
$ cat /etc/passwd | grep postgres
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash

### DBセットアップ
$ sudo su – postgres
$ postgresql-setup initdb

### 起動及び自動起動の設定
– プロセス確認
$ ps -ef | grep postgres
$ systemctl status postgresql -l –no-pager
$ sudo systemctl start postgresql
$ systemctl status postgresql -l –no-pager
$ sudo systemctl enable postgresql

### Postgresへログイン
$ su – postgres
$ sudo su – postgres
$ psql
postgres=#

OKKKKKKKKKKKK
postgresqlのバージョンが気になるので要確認

sedコマンド

文字列を全置換したり行単位で抽出したり、削除したり、テキスト処理できるコマンド
コマンドラインパラメータで指定して非対話的に一括処理もできる
sedはStream EDitorの略

### sedの構文
sed OPTIONS… [SCRIPT] [INPUTFILE…]
[SCRIPT]とは “s/foo/bar/g”
“-e”オプションで直後に[SCRIPT]が来る

$ echo “Tech Blog” | sed -e “s/Blog/Comment/g”
Tech Comment
$ echo “Tech Blog” | sed -e “s/ /-/g”
Tech-Blog

バックスラッシュはエスケープ
$ echo “Tech Blog” | sed -e “s/ /\!/”
Tech!Blog

二つ目に見つかった”o”を”_”に変換
$ echo “Hello World” | sed -e “s/o/__/2”
Hello W__rld

### ファイルの書き換え
$ echo “Hello World” > sample.txt
$ sed -e “s/World/Coffee/g” sample.txt
Hello Coffee
$ cat sample.txt
Hello World
$ sed -i -e “s/World/Shinbashi/g” sample.txt
$ cat sample.txt
Hello Shinbashi

他にも色々使い方ができる
取り敢えず置換ができると覚えておく

標準出力とは?

標準出力とは、コンピュータ上で実行されているプログラムが、特に何も指定されていない場合に標準的に利用するデータ出力先。コンピュータの出力装置やOSが提供するデータ出力機能・経路などを指し、多くのシステムではディスプレイ装置による利用者への文字表示が標準出力に設定されている。
標準エラー出力もある。

$ cp -v test.txt test_cp.txt
‘test.txt’ -> ‘test_cp.txt’
上記は入力元・出力先を指定している。

標準出力とは、コマンド/アプリ側で入力元・出力先を明示することなく使用できる入力・出力のこと

### 3種類の標準
– 入力…標準入力の1系統
– 出力…標準出力、標準エラーの2系統

標準入力…加工対象のデータの入力元や、ユーザからのパラメータ入力受付用(cpでの上書き確認のy/n)
標準出力…加工済みデータの出力先や、ログ、メッセージ等情報出力用
標準エラー…確認メッセージや警告、エラーといった情報の出力用

### アプリ使用者の立場として
– シェルでコマンド実行
– デフォルト
– リダイレクト・パイプライン

なんか分かったような分かってないような

[centos8] chronyで時刻同期

vagrant、centos8で時刻がおかしい。

# date
Fri Mar 19 06:32:40 JST 2021

ん? 日付も時刻も違う。。。
$ sudo vi /etc/chrony.conf

#pool 2.centos.pool.ntp.org iburst
server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
server ntp3.jst.mfeed.ad.jp iburst

# Allow NTP client access from local network.
#allow 192.168.0.0/16
allow 192.168.34.10

# chronyc sources
210 Number of sources = 4
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp1.jst.mfeed.ad.jp 2 6 17 4 +10ms[ +13ms] +/- 86ms
^+ ntp2.jst.mfeed.ad.jp 2 6 17 5 +2838us[+5730us] +/- 95ms
^+ ntp3.jst.mfeed.ad.jp 2 6 17 5 -5627us[-2734us] +/- 104ms
^? ntp-k1.nict.jp 0 6 0 – +0ns[ +0ns] +/- 0ns
# date
Sat Mar 20 08:04:11 JST 2021

ふう
ここで躓いたらエンジニア終了だな

systemctlとshellの理解を深める

### 最終ゴール
$ sudo systemctl restart mysqld.service
↑これをshellで実行したい

1.まずシェルを作ります。
hello.sh

#!/bin/bash
while true
do
	echo hello world >> /home/vagrant/dev/test3/hello.log
	sleep 1
done

2.実行権限
$ sudo chmod 0755 hello.sh

3./etc/systemd/systemの下にUnit定義ファイルを作成する
$ sudo vi /etc/systemd/system/hello.service

[Unit]
Description = hello daemon

[Service]
ExecStart = /home/vagrant/dev/test3/hello.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

L ServiceのExecStartが実行したいコマンド
L Restart=alwaysはサーバが不意に落ちた時に対応

4. Unitがserviceとして認識されたか確認
$ sudo systemctl list-unit-files –type=service | grep hello
hello.service disabled

5. 起動してステータス確認
$ sudo systemctl enable hello
$ sudo systemctl start hello
$ sudo systemctl status hello
● hello.service – hello daemon
Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: disabled)
Active: active (running) since 水 2021-01-20 10:35:02 JST; 14s ago
Main PID: 7220 (hello.sh)
CGroup: /system.slice/hello.service
├─7220 /bin/bash /home/vagrant/dev/test3/hello.sh
└─7235 sleep 1

1月 20 10:35:02 localhost systemd[1]: Started hello daemon.
1月 20 10:35:02 localhost systemd[1]: Starting hello daemon…

$ tail hello.log
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
$ sudo systemctl stop hello

$ sudo systemctl status hello
● hello.service – hello daemon
Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: disabled)
Active: inactive (dead) since 水 2021-01-20 10:38:06 JST; 21s ago
Process: 7220 ExecStart=/home/vagrant/dev/test3/hello.sh (code=killed, signal=TERM)
Main PID: 7220 (code=killed, signal=TERM)

1月 20 10:35:02 localhost systemd[1]: Started hello daemon.
1月 20 10:35:02 localhost systemd[1]: Starting hello daemon…
1月 20 10:38:06 localhost systemd[1]: Stopping hello daemon…
1月 20 10:38:06 localhost systemd[1]: Stopped hello daemon.

systemctl コマンドは、”systemd” をコントロールするコマンド
なるほど、systemctl restart mysqld.serviceは、mysqldのdaemonを管理してるってことね。
やっと理解した。

sysctl.conf とは?

/etc/sysctl.conf は、OS起動時に/proc/sysディレクトリのファイルに設定する値を記述するファイル。
カーネルパラメータを設定し、「/proc/sys」以下に反映する
net.ipv4.ip_forward=1 とすると、/proc/sys/net/ipv4/ip_forward ファイルの中身が1となる。
sysctl -a

$ sysctl -a
abi.vsyscall32 = 1
crypto.fips_enabled = 0
// 省略
vm.watermark_scale_factor = 10
vm.zone_reclaim_mode = 0

メモリの使い方、プロセス管理、ネットワーク関係など、様々な項目を設定できる。

e.g.

net.core.somaxconn = 1024 // TCPソケットが受け付けた接続要求を格納する、キューの最大長
net.core.netdev_max_backlog = 5000 // パケット受信時にキューに繋ぐことができるパケットの最大数
net.core.rmem_max = 16777216 // TCPとUDPの送信バッファのデフォルトサイズ
net.core.wmem_max = 16777216
net.ipv4.tcp_wmem = 4096 12582912 16777216 // TCP ソケットバッファー
net.ipv4.tcp_rmem = 4096 12582912 16777216
net.ipv4.tcp_max_syn_backlog = 8096 // ネットワークのルート・メトリクス
net.ipv4.tcp_slow_start_after_idle = 0 // 一定時間無通信状態が続いたらウィンドウサイズを初期値から開始する設定
net.ipv4.tcp_tw_reuse = 1 // TCPの接続を使いまわすかどうか
net.ipv4.ip_local_port_range = 10240 65535 // TCPソケットが受け付けた接続要求を格納するキューの最大長

何だこれは。。。

less, more, cat, tailの違い

cat
L 標準出力

more
L ファイル末尾まで行くと終了

less
L ファイル内容を閲覧、 qで終了

tail
L ファイル末尾だけ表示

実際にコマンドを打って確認しましょう。
$ cat hello.c
$ more hello.c
$ less hello.c

lessだと次の操作に移るのに[q]を打たないといけないので、catの方を多用していますが、行が長いファイルをじっくり確認したい場合はlessの方が使いやすい、と言ってる方もいます。