IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

はじめてのLinux

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第18回 Linux のプロセス管理を学ぼう (5) systemdからデーモンを起動しよう (濱田康貴) 2024年3月

みなさんこんにちは。株式会社パイプラインの濱田です。前回はcronによるLinuxのプログラム自動実行について取り上げました。今回は、Linuxのデーモンプログラムをsystemd経由で起動 停止 そしてOS起動後に自動起動する方法について取り上げます。

そもそもデーモンとは何なのか?

前回までは、プログラムを手動またはcronによる自動実行させる方法を学びました。しかし、例えばいつ外部からの接続があるのかわからない(自分で制御できない)http(s)やSMTPなど、これらを待ち受けるプログラムを都度手動で起動することが現実的ではないプログラムがあります。こうした機能を待ち受けるプログラムはOS起動後に常駐起動させる必要があります。
手動でプログラムを実行した場合、ターミナルを抜けるとそのプログラムは終了してしまいますし、バックグラウンドで起動したとして、これを意図的に終了させるのは、そのプログラムのID (PID)を特定したり、そのプログラムから生成された子プロセスから終了させなければならなかったりするので、人間の運用負荷が上昇してしまいます。
http(s)で例えますと、ApacheやNginxなどのプログラムをデーモンとして起動するのが一般的で、これらのプログラムをデーモンとして起動することで上記のような課題を解決することができます。

systemd経由でデーモンを起動 停止させる方法

今回はWEBサーバーであるNginxを例に、systemd経由でデーモンを起動 停止させる手順を解説します。まず、現在Nginxのデーモンが起動しているかどうか systemctlコマンド(systemdパッケージに含まれるコマンド)を用いて確認します。


nullpopopo@web-0001:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-02-02 20:21:59 JST; 1 week 1 day ago
       Docs: man:nginx(8)
   Main PID: 746 (nginx)
      Tasks: 4 (limit: 2220)
     Memory: 33.7M
        CPU: 19.193s
     CGroup: /system.slice/nginx.service
             ├─746 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─747 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             ├─748 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             └─749 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
Feb 02 20:21:58 web-0001 systemd[1]: Starting A high performance web server and a reverse proxy server...
Feb 02 20:21:59 web-0001 systemd[1]: Started A high performance web server and a reverse proxy server.

上記のように、「Active: active (running)」と表示されていればNginxは起動しています。余談ですが、ターミナルの表示行が少ない状態でsystemctlコマンドを実行すると、lessコマンドのようにページャーが表示になってしまうので、「--no-pager」オプションをつけるか、あるいは上記例のようにパイプラインでcatコマンドに渡す方法もあります。scriptコマンドなどでログを採っている際に制御文字によるカラーリングがログファイルの可読性を下げてしまうこともありますので、パイプライン経由でcatコマンドに渡してあげることで、制御文字を表示させないようにすることもできます。

現在、Nginxが起動していますので、まずこれを停止させます。systemctlコマンドでデーモンを起動 停止させるには root ユーザーになるか、sudoをつけて(sudo権限を持った)一般ユーザーで実行する必要があります。


nullpopopo@web-0001:~$ sudo systemctl stop nginx

systemctl コマンドのサブコマンドとして stop start restartを実行したとき、コマンドの成否はターミナルに表示されずプロンプトに戻ります。ですので、これらサブコマンドを実行したあとはすぐにsystemctl status <デーモン名> を実行するとよいでしょう。


nullpopopo@web-0001:~$ systemctl status nginx | cat
○ nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Sat 2024-02-10 21:16:08 JST; 4s ago
       Docs: man:nginx(8)
    Process: 117575 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
   Main PID: 746 (code=exited, status=0/SUCCESS)
        CPU: 19.214s
Feb 02 20:21:58 web-0001 systemd[1]: Starting A high performance web server and a reverse proxy server...
Feb 02 20:21:59 web-0001 systemd[1]: Started A high performance web server and a reverse proxy server.
Feb 10 21:16:08 web-0001 systemd[1]: Stopping A high performance web server and a reverse proxy server...
Feb 10 21:16:08 web-0001 systemd[1]: nginx.service: Deactivated successfully.
Feb 10 21:16:08 web-0001 systemd[1]: Stopped A high performance web server and a reverse proxy server.
Feb 10 21:16:08 web-0001 systemd[1]: nginx.service: Consumed 19.214s CPU time.

このように「 Active: inactive (dead)」と表示されたので、Nginxデーモンが停止したことがわかります。それでは、Nginxデーモンを起動してみましょう。


nullpopopo@web-0001:~$ sudo systemctl start nginx

確認してみましょう。


nullpopopo@web-0001:~$ systemctl status nginx | cat
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-02-10 21:16:19 JST; 6s ago
       Docs: man:nginx(8)
    Process: 117583 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 117584 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 117585 (nginx)
      Tasks: 4 (limit: 2220)
     Memory: 6.7M
        CPU: 47ms
     CGroup: /system.slice/nginx.service
             ├─117585 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─117586 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             ├─117587 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             └─117588 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
Feb 10 21:16:19 web-0001 systemd[1]: Starting A high performance web server and a reverse proxy server...
Feb 10 21:16:19 web-0001 systemd[1]: Started A high performance web server and a reverse proxy server.

Nginxデーモンが起動されたことが確認できました。

OS起動時に systemd経由でデーモンを自動起動させる方法

デーモンプログラム(常駐プログラム)はOS起動時、自動的に起動してくれると嬉しいことがほとんどです。systemdはこうした要望にも応えてくれますし、今回はスペースの都合で割愛しますが、複数のデーモンを順に起動させたい場合、その順序も制御することができます。例えば1台のサーバーでWEBサーバーとDBサーバーを起動する場合、先にDBサーバーを起動し、その後にWEBサーバーを起動したい、というようなユースケースが一般的です。
OS起動時にNginxデーモンが自動起動される設定になっているかどうかは、systemctlコマンドのサブコマンド is-enabled で確認します。


nullpopopo@web-0001:~$ systemctl is-enabled nginx
enabled

このように、「enabled」と表示されているので、OS起動時にNginxは自動的に起動される設定になっています。
今回の演習のために、Nginxの自動起動設定を一旦外してみましょう。自動起動させない設定は、systemctlコマンドのサブコマンド disable を用います。


nullpopopo@web-0001:~$ sudo systemctl disable nginx
Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable nginx
Removed /etc/systemd/system/multi-user.target.wants/nginx.service.

それでは、再度確認してみましょう。


nullpopopo@web-0001:~$ systemctl is-enabled nginx
disabled

先ほど「enabled」と表示されていたところが「disabled」と表示されました。これにより、この後OSを再起動してもNginxは起動しなくなります。これでは不便ですので、OS起動時にNginxが自動起動されるようにします。


nullpopopo@web-0001:~$ sudo systemctl enable nginx
Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /lib/systemd/system/nginx.service.

もう1度確認してみましょう。


nullpopopo@web-0001:~$ systemctl is-enabled nginx
enabled

ふたたび「enabled」と表示されましたので、OS起動時にNginxは自動的に起動されるようになりました。
systemctlコマンドは、デーモンの起動 停止 再起動、そしてデーモンの自動起動設定など、システム全体に影響をおよぼすサブコマンドを実行する際、rootユーザーで実行するか、あるいはsudoをつけて実行する必要があります。反対に、 statusサブコマンドや is-enabled サブコマンドを実行する際は一般ユーザーでも実行可能となっています。オペミスによる誤実行(が本当に実行されてしまうこと)を防ぐためにも、一般ユーザーで実行可能なコマンドは極力一般ユーザーで実行する習慣をつけましょう。

CTC 教育サービスではLinux をはじめ多数の研修コースが用意されています。ご自身の興味や業務の必要性にあったコースを受講してみてはいかがでしょうか。
https://www.school.ctc-g.co.jp/category/

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes