自作スクリプトをサービス登録する(chkconfig –add)

IT技術

概要

自身で作成したスクリプトを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 ~]# 
タイトルとURLをコピーしました