そろそろ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でインストールされるtomcatとhttpdの
設定ファイルを見てみます。
[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系からみると
変更されていますね。次は制御系のコマンドをまとめたいと思ってます。