そろそろCentOS7をさわっていくか systemctlコマンドを確認していく

typeでの一覧表示。下記はserviceでのコマンド例。
ACTIVE欄がfailedになっている場合は本来有効化される設定のUnitが動いてない場合。

[root@localhost ~]# systemctl --type=service
UNIT                                                                 LOAD   ACTIVE SUB     DESCRIPTION
auditd.service                                                       loaded active running Security Auditing Service
avahi-daemon.service                                                 loaded active running Avahi mDNS/DNS-SD Stack
chronyd.service                                                      loaded active running NTP client/server
crond.service                                                        loaded active running Command Scheduler
(中略)
systemd-vconsole-setup.service                                       loaded active exited  Setup Virtual Console
tuned.service                                                        loaded active running Dynamic System Tuning Daemon

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

37 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.


failedしたUnitを表示する

[root@localhost ~]# systemctl --failed
0 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.


現在の状態関係なく定義されてるUnitを確認する。
grepと合わせて設定状態の個別確認にも使える。
STATEの詳細はenable 有効、disable 無効、static 自動起動設定を持たないもの

[root@localhost ~]# systemctl list-unit-files --type=service
UNIT FILE                                   STATE
arp-ethers.service                          disabled
auditd.service                              enabled
(中略)
systemd-user-sessions.service               static
systemd-vconsole-setup.service              static
teamd@.service                              static
tomcat.service                              disabled
tuned.service                               enabled
wpa_supplicant.service                      disabled

125 unit files listed.
[root@localhost ~]# systemctl list-unit-files --type=service | grep tomcat
tomcat.service                              disabled


Unitの有効・無効化を行うには
systemctl enable Unit名
systemctl disable Unit名
で行います。
systemctl is-enabled Unit名 で有効・無効化の状態を確認します。
下記はtomcatの状態を確認して有効化後、確認。
そして、また無効化して確認した例です。

[root@localhost ~]# systemctl is-enabled tomcat
disabled
[root@localhost ~]# systemctl enable tomcat
ln -s '/usr/lib/systemd/system/tomcat.service' '/etc/systemd/system/multi-user.target.wants/tomcat.service'
[root@localhost ~]# systemctl is-enabled tomcat
enabled
[root@localhost ~]# systemctl disable tomcat
rm '/etc/systemd/system/multi-user.target.wants/tomcat.service'
[root@localhost ~]# systemctl is-enabled tomcat
disabled


OS起動後にUnitを手動制御
systemctl start Unit名
systemctl restart Unit名
systemctl reload Unit名
systemctl stop Unit名
下記はtomcatをstart,stopした例
※設定ファイルに記述がない場合はコマンドは発行出来ません。

[root@localhost ~]# systemctl start tomcat
[root@localhost ~]# ps -ef | grep java
tomcat    2286     1 19 13:49 ?        00:00:01 java -classpath /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat -Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat/temp -Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
root      2306  2164  0 13:49 pts/0    00:00:00 grep --color=auto java
[root@localhost ~]# systemctl stop tomcat
[root@localhost ~]# ps -ef | grep java
root      2344  2164  0 13:49 pts/0    00:00:00 grep --color=auto java


systemdを再起動して追加や変更のあったUnitの設定を読み込み直す。

[root@localhost ~]# systemctl daemon-reload

そろそろCentOS7をさわっていくか daemonの起動設定ファイルを見てみる

RHEL7/CentOS7では起動&サービス処理がsystemdに変更されてます。


設定ファイルがどのように記述されているのか?
というのをhttpdとtomcatの設定ファイルをもとに見てみます。


今までは/etc/init.dにある起動シェルを
一つずつ処理してましたがsystemdはUnitという単位に
処理をまとめて可能な限り並列処理して起動を早くしています。


Unitのタイプは複数ありますがdaemonの起動に利用するのは
serviceというタイプになります。


Unitの設定ファイルはシステムのデフォルトの設定が
/usr/lib/systemd/system
に配置され
/etc/systemd/system
にユーザが追加・修正したものを配置するようになってます。


両方に同じ名前のファイルがある場合は/etc/systemd/systemに
あるものを優先させます。デフォルトからいじる場合は
/usr/lib/systemd/system から /etc/systemd/system に
コピーして更新するイメージです。


UnitはUnit間に関係を持っているもの以外は同時に処理します。
関係性を設定ファイルに記述して起動の順番を制御します。


CentOS7でyumでインストールされるtomcathttpd
設定ファイルを見てみます。

[root@localhost system]# cat /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target
[root@localhost system]# cat /usr/lib/systemd/system/tomcat.service
# Systemd unit file for tomcat
#
# To create clones of this service:
# 1) By default SERVICE_NAME=tomcat. When cloned, the value must be defined
# before tomcat-sysd is called.
# 2) Create /etc/sysconfig/${SERVICE_NAME} from /etc/sysconfig/tomcat
# to override tomcat defaults

[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/usr/sbin/tomcat-sysd start
ExecStop=/usr/sbin/tomcat-sysd stop
SuccessExitStatus=143
User=tomcat
Group=tomcat


[Install]
WantedBy=multi-user.target

・起動順番の制御
[Install]のWantedByのmulti-user.targetはrun level 3で
起動されます。この起動を前提に起動するという
依存関係の設定となります。


daemonを設定するという用途ならたいていは
run level 3と5がどれに該当するかを意識すればOKです。


そこの設定は設定ファイルの[Install]項に
WantedBy=xxxx
という用に記述をします。


run level3が
WantedBy=multi-user.target


run level 5が
WantedBy=graphical.target
になります。


次に[Unit]のAfterで更に細かく制御します。
設定ファイルを記述しているサービスが起動する前に起動するべき
Unitを記述して起動順番をきめる項目になります。


この2つの項目の設定で適切なrun leverlで起動し、
このサービスの起動前に起動しておくべきサービスの後に
設定ファイルのサービスが起動するという起動の順番の制御が
設定されています。


・サービスの起動と停止の制御
[Service]の中に記述します。ExecStart はサービスの起動コマンドです。
ExecReload はtomcatにはありませんがhttpd等には存在して
gracefulでReloadさせたりします。ExecStop はサービスの停止コマンドです。


・サービスのExecStart後の状態
[Service]の中にTypeを記述します。
forkingは起動プログラムは終了するものを指しています。
他にsimpleやoneshot等が存在します。


・その他
UserとGroupがtomcatの設定ファイルには記述されていますが
httpdには記述されておらずhttp.confの中のものを使います。
PrivateTmpはセキュリティの為に専用のtmp領域を使うという設定。
この他にサービスプロセス停止時の再起動条件を決定するRestart等の
パラメータがあります。


設定ファイルを見ていきましたが、このようにだいぶRHEL6系からみると
変更されていますね。次は制御系のコマンドをまとめたいと思ってます。