コンテンツにスキップ

メモリ系@パッケージ

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


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