概要
自身で作成したスクリプトをchkconfig –addコマンドでサービスとして「SysVinit」に登録する。
【注意】本記事のシステム環境はOracle Linux 8のため、本来は「SysVinit」ではなく「systemd」を使用することが推奨されている。
システム環境
Oracle Linux Server 8.5
自作スクリプトのサービス登録
スクリプトの作成
実行するスクリプト本体を作成する。
[root@testvm999 ~]# vi /var/tmp/test_srv.sh
#!/bin/bash
# chkconfig: 2345 99 99
# description: test_srv
LOG_FILE="/var/tmp/test_srv.log"
case "$1" in
start)
echo "`date '+%Y/%m/%d %H:%M'` Start" >> ${LOG_FILE}
;;
stop)
echo "`date '+%Y/%m/%d %H:%M'` Stop" >> ${LOG_FILE}
;;
restart)
echo "`date '+%Y/%m/%d %H:%M'` Restart" >> ${LOG_FILE}
;;
*)
echo $"Usage: {start|stop|restart}"
esac
[root@testvm999 ~]#
スクリプトに実行権限を付与する。
[root@testvm999 ~]# chmod 755 /var/tmp/test_srv.sh
[root@testvm999 ~]# ls -l /var/tmp/test_srv.sh
-rwxr-xr-x. 1 root root 225 Mar 25 23:41 /var/tmp/test_srv.sh
[root@testvm999 ~]#
スクリプトを手動実行すると、以下のような結果になる。
[root@testvm999 ~]# /var/tmp/test_srv.sh start
[root@testvm999 ~]# /var/tmp/test_srv.sh stop
[root@testvm999 ~]# /var/tmp/test_srv.sh restart
[root@testvm999 ~]# /var/tmp/test_srv.sh dummy
Usage: {start|stop|restart}
[root@testvm999 ~]#
[root@testvm999 ~]# cat /var/tmp/test_srv.log
2023/03/25 23:03 Start ★
2023/03/25 23:03 Stop ★
2023/03/25 23:03 Restart ★
[root@testvm999 ~]#
スクリプトを/etc/init.dディレクトリ配下に配置(シンボリックリンク作成)
スクリプトを/etc/init.dディレクトリ配下に配置する。
本体を配置しても良いが、今回はシンボリックリンクを作成した。
[root@testvm999 ~]# ln -s /var/tmp/test_srv.sh /etc/init.d/test_srv
[root@testvm999 ~]# ll /etc/init.d/test_srv
lrwxrwxrwx. 1 root root 20 Mar 25 23:44 /etc/init.d/test_srv -> /var/tmp/test_srv.sh
[root@testvm999 ~]#
サービス登録
chkconfig –addコマンドでサービス登録する。
[root@testvm999 ~]# chkconfig --list
Note: This output shows SysV services only and does not include native
systemd services. SysV configuration data might be overridden by native
systemd configuration.
If you want to list systemd services use 'systemctl list-unit-files'.
To see services enabled on particular target use
'systemctl list-dependencies [target]'.
network 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@testvm999 ~]#
[root@testvm999 ~]# chkconfig --add test_srv
[root@testvm999 ~]# chkconfig --list
Note: This output shows SysV services only and does not include native
systemd services. SysV configuration data might be overridden by native
systemd configuration.
If you want to list systemd services use 'systemctl list-unit-files'.
To see services enabled on particular target use
'systemctl list-dependencies [target]'.
network 0:off 1:off 2:off 3:off 4:off 5:off 6:off
test_srv 0:off 1:off 2:on 3:on 4:on 5:on 6:off ★
[root@testvm999 ~]#
serviceコマンド実行
serviceコマンドで登録したサービスを制御する。
[root@testvm999 ~]# service test_srv start
[root@testvm999 ~]# service test_srv stop
[root@testvm999 ~]# service test_srv restart
[root@testvm999 ~]# service test_srv dummy
Usage: {start|stop|restart}
[root@testvm999 ~]#
[root@testvm999 ~]# cat /var/tmp/test_srv.log
2023/03/25 23:03 Start
2023/03/25 23:03 Stop
2023/03/25 23:03 Restart
2023/03/26 00:03 Start ★
2023/03/26 00:03 Stop ★
2023/03/26 00:03 Restart ★
[root@testvm999 ~]#
特記事項
「SysVinit」に登録したサービスは、暗黙的に「systemd」にマッピングされる
chkconfig –addコマンドで「SysVinit」にサービス登録すると、暗黙的に「systemd」にマッピングされる。
詳細は「/etc/init.d/README」ファイルを参照。
[root@testvm999 ~]# systemctl list-units --all --type=service | grep test_srv
test_srv.service loaded inactive dead SYSV: test_srv
[root@testvm999 ~]#
[root@testvm999 ~]# systemctl status test_srv
● test_srv.service - SYSV: test_srv
Loaded: loaded (/etc/rc.d/init.d/test_srv; generated)
Active: inactive (dead) since Sun 2023-03-26 00:28:56 GMT; 57min ago
Docs: man:systemd-sysv-generator(8)
Process: 3649 ExecStop=/etc/rc.d/init.d/test_srv stop (code=exited, status=0/SUCCESS)
Process: 3532 ExecStart=/etc/rc.d/init.d/test_srv start (code=exited, status=0/SUCCESS)
Mar 26 00:28:25 testvm999 systemd[1]: Starting SYSV: test_srv...
Mar 26 00:28:25 testvm999 systemd[1]: Started SYSV: test_srv.
Mar 26 00:28:56 testvm999 systemd[1]: Stopping SYSV: test_srv...
Mar 26 00:28:56 testvm999 systemd[1]: test_srv.service: Succeeded.
Mar 26 00:28:56 testvm999 systemd[1]: Stopped SYSV: test_srv.
[root@testvm999 ~]#
OS起動時に「Permission denied」エラー発生
サービス登録後にOS再起動した際、スクリプトが実行されていなかった。
syslogを確認すると、以下のように「Permission denied」エラー発生していた。
Mar 26 00:03:28 testvm999 systemd[1]: Starting SYSV: test_srv...
Mar 26 00:03:28 testvm999 systemd[1461]: test_srv.service: Failed to execute command: Permission denied
Mar 26 00:03:28 testvm999 systemd[1461]: test_srv.service: Failed at step EXEC spawning /etc/rc.d/init.d/test_srv: Permission denied
スクリプトの権限不足を疑ったが、実行権限は付与されていた。
[root@testvm999 ~]# ls -l /etc/init.d/test_srv
lrwxrwxrwx. 1 root root 20 Mar 25 23:44 /etc/init.d/test_srv -> /var/tmp/test_srv.sh
[root@testvm999 ~]# ls -l /var/tmp/test_srv.sh
-rwxr-xr-x. 1 root root 379 Mar 25 23:58 /var/tmp/test_srv.sh
[root@testvm999 ~]#
さらにsyslogを確認したところ、以下のエラーメッセージが出ていた。
Mar 26 00:03:28 testvm999 systemd[1]: test_srv.service: Control process exited, code=exited status=203
Mar 26 00:03:28 testvm999 systemd[1]: test_srv.service: Failed with result 'exit-code'.
Mar 26 00:03:28 testvm999 systemd[1]: Failed to start SYSV: test_srv.
・・・
Mar 26 00:03:52 testvm999 setroubleshoot[1501]: SELinux is preventing (test_srv) from execute access on the file test_srv.sh. For complete SELinux messages run: sealert -l a89e7eaa-1bcb-426a-b298-f56e1b95681d
Mar 26 00:03:52 testvm999 setroubleshoot[1501]: SELinux is preventing (test_srv) from execute access on the file test_srv.sh.#012#012***** Plugin catchall (100. confidence) suggests **************************#012#012If you believe that (test_srv) should be allowed execute access on the test_srv.sh file by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c '(test_srv)' --raw | audit2allow -M my-testsrv#012# semodule -X 300 -i my-testsrv.pp#012
・・・
SELinuxの影響を受けてエラーが出ていると考え、SELinuxを無効化した。
[root@testvm999 ~]# getenforce
Enforcing
[root@testvm999 ~]# vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled ★enforcingからdisabledに変更
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@testvm999 ~]#
[root@testvm999 ~]# reboot
[root@testvm999 ~]# getenforce
Disabled
[root@testvm999 ~]#
SELinuxを無効化したことで「Permission denied」エラーが解消し、OS起動時にサービスが実行された。
[root@testvm999 ~]# cat /var/tmp/test_srv.log
2023/03/25 23:03 Start
2023/03/25 23:03 Stop
2023/03/25 23:03 Restart
2023/03/26 00:03 Start
2023/03/26 00:03 Stop
2023/03/26 00:03 Restart
2023/03/26 00:03 Start ★
[root@testvm999 ~]#