メモリ系@パッケージ¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. pstree¶
インストール¶
▼ aptリポジトリから¶
$ apt install pstree
$ apt-get install pstree
pstreeとは¶
プロセスの親子関係をツリー状に取得する。
# MacOSの場合
$ pstree
-+= 00001 root /sbin/launchd
|--= 00059 root /usr/sbin/syslogd
|--= 00060 root /usr/libexec/UserEventAgent (System)
|-+= 00062 root /Applications/ESET Endpoint Security.app/Contents/MacOS/esets_ctl
| \-+= 00286 root /Applications/ESET Endpoint Security.app/Contents/MacOS/esets_daemon
| |--- 00323 root /Applications/ESET Endpoint Security.app/Contents/MacOS/esets_daemon --scan-process
| |--- 00455 root /Applications/ESET Endpoint Security.app/Contents/MacOS/esets_fcor
...
02. supervisor¶
インストール¶
▼ pipリポジトリから¶
$ pip3 install supervisor
supervisorの構成要素¶
▼ supervisor¶
Python製のユーティリティである。
メモリ上の複数のプロセスをデーモン化し、一括で管理する。
▼ supervisorctl¶
supervisordを操作する。
▼ supervisord¶
supervisor自体のプロセスのこと。
supervisordセクション¶
▼ supervisordセクションとは¶
supervisorのsupervisord
プロセスのプールを設定する。
[supervisord]
...
▼ directory¶
デーモン化されたプロセスの起動コマンドを実行する作業ディレクトリを設定する。
[supervisord]
directory=/var/www/foo
▼ logfile¶
supervisordのログファイルの場所を設定する。
[supervisord]
logfile=/var/log/supervisor/supervisord.log
▼ loglevel¶
supervisordのログレベルを設定する。
[supervisord]
loglevel=info
▼ nodaemon¶
supervisordをフォアグラウンドで起動するか否かを設定する。
[supervisord]
nodaemon=true
▼ pidfile¶
supervisordのpidが記載されるファイルを設定する。
[supervisord]
pidfile=/var/tmp/supervisor/supervisord.pid
▼ redirect_stderr¶
標準出力への出力を標準エラー出力に転送する可動化を設定する。
[supervisord]
redirect_stderr=true
▼ user¶
supervisordの実行ユーザーを設定する。
[supervisord]
user=root
programセクション¶
▼ programセクションとは¶
デーモン化されたプロセスを設定する。
[program:<プログラム名>]
...
[program:foo]
...
▼ autorestart¶
デーモン化されたプロセスの異常停止時に自動的に起動させるか否かを設定する。
[program:foo]
autorestart=true
▼ autostart¶
supervisordの起動時に、デーモン化されたプロセスを自動的に起動させるか否か、を設定する。
[program:foo]
autostart=true
▼ command¶
デーモン化されたプロセスの起動コマンドを設定する。
[program:foo]
command=/usr/sbin/crond -n
▼ redirect_stderr¶
デーモン化されたプロセスの標準出力への出力を標準エラー出力に転送するか否かを設定する。
[program:foo]
redirect_stderr=true
▼ startretries¶
デーモン化されたプロセスの起動に失敗した場合、何回再試行するかを設定する。
[program:foo]
startretries=10
▼ stdout_logfile、stderr_logfile¶
デーモン化されたプロセスの標準出力/標準エラー出力の出力先を設定する。
デフォルト値は/var/log/supervisor
ディレクトリである。
もし、/dev/stdout
ディレクトリまたは/dev/stderr
ディレクトリを使用する場合は、logfile_maxbytes
オプションの値を0
(無制限) とする必要がある。
[program:foo]
# 標準出力の場所
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
# 標準エラー出力の場所
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
▼ stdout_logfile_backups¶
ログローテートによって作成されるバックアップの世代数。
[program:foo]
stdout_logfile_backups=10
▼ stdout_logfile_maxbytes¶
ログファイルの最大サイズ。
設定値を超えると、ログローテートが実行される。
これにより、ログファイルがバックアップとして保管され、新しいログファイルを作成する。
[program:foo]
stdout_logfile_maxbytes=50MB
▼ user¶
デーモン化されたプロセスの実行ユーザーを設定する。
[program:foo]
user=root
groupセクション¶
▼ priority¶
[group]
priority=999
▼ programs¶
グループ化するデーモン名を設定する。
[group]
programs=bar,baz
supervisorctl¶
▼ restart¶
指定したデーモンを再起動する。
all
とした場合は、全てを再起動する。
$ supervisorctl restart <デーモン名>
▼ update¶
もしsupervisord.conf
ファイルの設定を変更した場合、これを再読み出しする。
$ supervisorctl update
03. systemctl:system control (新service)¶
systemctlの構成要素¶
▼ systemctl¶
メモリ上のプロセスをデーモン化する機能を持つsystemdを制御する。
▼ systemd:system daemon¶
メモリ上の複数のプロセスをデーモン化し、一括で管理する。
ユニットファイルに基づいて、プロセスをユニット別に操作する。
ユニットは拡張子の違いで判別する。
ユニットタイプ | ユニットの拡張子 | 説明 |
---|---|---|
serviceユニット | .service |
プロセス起動停止に関するデーモン。 |
mountユニット | .mount |
ファイルのマウントに関するデーモン。 |
socketユニット | .socket |
ソケットとプロセスの紐付けに関するデーモン。 |
インストール¶
▼ aptリポジトリから¶
$ apt install systemd
$ apt-get install systemd
ユニットファイル¶
▼ ユニットファイルとは¶
デーモンの起動/停止方法を定義したファイル。
デフォルト値が定義されたファイルは/usr/lib/systemd/system
ディレクトリ配下に配置され、これは変更できない。
カスタムユニットファイルは、/etc/sytemd/system
ディレクトリ配下に配置する。
▼ Unitセクション¶
ユニットの種類に関係ない全般的なオプションを設定する。
[Unit]
Description=The Apache HTTP Server
# このユニットの前に実行するユニット
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)
# ユニットが失敗状態時に起動するユニット
OnFailure=notify-email@%i.service
▼ Serviceセクション¶
serviceユニットのオプションを設定する。
[Service]
# デーモンの実行ユーザーを。もし設定しない場合、root権限の実行ユーザーを使用する。
# https://www.golinuxcloud.com/run-systemd-service-specific-user-group-linux/
User=foo
Type=notify
# コマンドの引数 ($OPTIONS変数) を定義したファイルを設定する。
EnvironmentFile=/etc/sysconfig/httpd
# systemctl startコマンド時に実行するコマンド
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
# systemctl reloadコマンド時に実行するコマンド
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
# systemctl stopコマンド時に実行するコマンド
ExecStop=/bin/kill -WINCH ${MAINPID}
KillSignal=SIGCONT
PrivateTmp=true
# ulimitコマンドのnオプションに相当する
LimitNOFILE=12345
EnvironmentFile
として使用するsysconfig
ファイルには、.env
ファイルと同じような形式のものを作成する。
OPTIONS=foo
▼ Installセクション¶
ユニットのインストール (systemctl enable
コマンドの実行) 時のオプションを設定する。
[Install]
# シンボリックリンクを作成するディレクトリ (/etc/systemd/system/<設定値>)
WantedBy=multi-user.target
systemctl¶
▼ daemon-reload¶
サーバー内で/etc/sytemd/system
ディレクトリ配下のカスタムユニットファイルを直接変更した場合に使用する。
全てのデーモンのカスタムユニットファイルを再読み込みする。
ただし、デーモンが既に稼働中の場合は、systemctl restart
コマンドが別途必要になる。
$ systemctl daemon-reload
▼ disable¶
OSの起動時に、デーモン化されたプロセスが自動起動しないように設定する。
$ systemctl disable <ユニット名>
# 例:Cron、Apache
$ systemctl disable crond.service
$ systemctl disable httpd.service
▼ enable¶
OSの起動時に、デーモン化されたプロセスが自動起動するように設定する。
$ systemctl enable <ユニット名>
# 例:Cron、Apache
$ systemctl enable crond.service
$ systemctl enable httpd.service
▼ list-units¶
デーモン化されたプロセスの稼働状態を一覧を取得する。
grep
と組み合わせて、起動中 (active
) 、停止中 (inactive
) 、起動失敗 (failed
) のデーモンのみを取得すると良い。
$ systemctl list-units --type=<ユニットの拡張子>
$ systemctl list-units --type=service | grep active
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-ccpp.service loaded active exited Install ABRT coredump hook
abrt-oops.service loaded active running ABRT kernel log watcher
abrtd.service loaded active running ABRT Automated Bug Reporting Tool
...
$ systemctl list-units --type=mount | grep active
UNIT LOAD ACTIVE SUB DESCRIPTION
-.mount loaded active mounted /
dev-hugepages.mount loaded active mounted Huge Pages File System
dev-mqueue.mount loaded active mounted POSIX Message Queue File System
...
▼ list-unit-files¶
デーモン化されたプロセスのUnitの一覧と、OS起動時にデーモンが自動起動するようになっているか否か、を取得する。
$ systemctl list-unit-files --type=<ユニットの拡張子>
$ systemctl list-unit-files --type=service
UNIT FILE STATE
crond.service enabled # enable:自動起動する
supervisord.service disabled # disable:自動起動しない
systemd-reboot.service static # enable:他サービス依存
$ systemctl list-unit-files --type=mount
UNIT FILE STATE
dev-hugepages.mount static
dev-mqueue.mount static
proc-fs-nfsd.mount static
proc-sys-fs-binfmt_misc.mount static
▼ log¶
systemctl
コマンドにはログを取得するオプションがないため、代わりにjournalctl
コマンドを使用する。
▼ reload¶
デーモン化されたプロセスを安全に再起動する。
$ systemctl reload <ユニット名>
$ systemctl reload nginx.service
▼ restart¶
デーモン化されたプロセスを強制的に再起動する。
$ systemctl restart <ユニット名>
$ systemctl restart httpd.service
$ systemctl restart nginx.service
▼ start¶
デーモン化されたプロセスを起動する。
$ systemctl start <ユニット名>
$ systemctl start httpd.service
$ systemctl start nginx.service
▼ status¶
デーモン化されたプロセスの状態を確認する。
$ systemctl status <ユニット名>
$ systemctl status rsyslog.service
rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since Thr 2017-12-07 07:03:21 JST; 8h left
Main PID: 959 (rsyslogd)
CGroup: /system.slice/rsyslog.service
mq959 /usr/sbin/rsyslogd -n
▼ stop¶
デーモン化されたプロセスを停止する。
$ systemctl stop <ユニット名>
$ systemctl stop httpd.service
$ systemctl stop nginx.service
journalctl¶
▼ journalctlとは¶
systemで管理する全てのユニットのログを取得する。
grep
コマンドで特定のエラーログレベルに絞る必要がある。
$ journalctl | grep error
▼ -u¶
特定のユニットのみのログを取得する。
$ journalctl -u foo.service | grep error
systemdのアラート¶
▼ アラートを直接的に通知する場合¶
デーモンが失敗状態になった時に、メールアドレスやチャット宛にアラートを直接的に送信するためには、OnFailure
オプションを使用する。
この時に指定するユニットファイル名には、「@%i
』が必要である (実際のファイル名に%i
は不要である) 。
[Unit]
...
# ユニットが失敗状態時に起動するユニット
OnFailure=notify-email@%i.service
/etc/systemd/system/notify-email@.service
ファイルで、失敗状態時に起動するユニットを定義しておく。ExecStart
オプションで、特定のアドレスにメールを送信する。
# notify-email@.serviceファイル
[Unit]
Description=Sent email
[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c \
'systemctl status %i | /mailx -Ssendwait -s "[SYSTEMD_%i] Fail" example@gmail.com'
[Install]
WantedBy=multi-user.target
▼ アラートを間接的に通知する場合¶
デーモンが失敗状態になった時に、出力したログを使用してアラートを送信するためには、StandardOutput
オプションやStandardError
オプションを使用する。
一度、ログとして出力し、このログをCloudWatchログなどに送信する。
[Service]
...
StandardOutput=file:/var/log/foo-service/stdout.log
StandardError=file:/var/log/foo-service/stderr.log
04. xclip¶
インストール¶
▼ aptリポジトリから¶
$ apt install xclip
$ apt-get install xclip
▼ yumリポジトリから¶
$ yum install -y xclip
xclipとは¶
標準出力/標準エラー出力の内容をコピーし、メモリ上に保持する。
-selection¶
▼ -selectionとは¶
コピーした内容を保持する場所を選択する。
*例*
ファイルの内容を、メモリ上のクリップボードにコピーする。
$ cat foo.txt | xclip -selection clipboard
*例*
コマンドの実行結果を、メモリ上のクリップボードにコピーする。
$ ls -la | xclip -selection clipboard
▼ -o¶
保持した内容をファイルに出力する。
*例*
クリップボードの内容をファイルに出力する。
$ xclip -selection clipboard -o > foo.txt