201305222339開機時,自動啟動Systemd的Service ─ 以Node.js Web Server為例

我的OS是Archlinux,目前的init是systemd。
日前開始學習Node.js,並且用它來寫Web Server,以及在這之上的應用。
因為想要這Web Server可以在Production上跑,所以要開機可以直接啟動,不用再人工下指令。
問題來了,過去SysVInit、upstart知道可以用 chkconfig update-rc.d 來更新開機要啟動的服務,再要不然就寫在rc.local裡。然後要執行的程式或指令,就放在/etc/init.d之類的資料夾下。
那systemd要怎麼用呢?(除了寫在rc.local外)

之前有發過一篇文章Systemd on Archlinux,裡頭有個外部連結http://iori.tw/sysv、upstart與systemd簡易介紹與對照/,Fedora的wiki裡也有相同的SysVInit和systemd的比較:SysVinit to Systemd Cheatsheet

所以可以看到要用systemctl enable WANTED.service,來設定開機啟動要執行的程式。而WANTED.service的設定就放在/lib/systemd/system/下面(Archlinux是/usr/lib/systemd/system/)。
因為這次是要跑HTTP Server,所以就以www.service來當例子。

編輯www.service,並存放在/usr/lib/systemd/system/www.service,以下是該檔的簡單設定:

[Unit]
Description=Node.js WWW Daemon
After=network.target

[Service]
Environment=NODE_ENV=production
ExecStart=/usr/bin/node /var/nodejs/server.js

[Install]
WantedBy=multi-user.target
Description: service的簡單敘述。
After: 要在哪樣東西之後跑本service,不是直接掛在After指定的後面跑,而是要先執行過After,才可以執行這支service。
Environment: 這service的環境變數設定。
ExecStart: service要執行的指令。
WantedBy: 要掛在哪個target裡。因為一般正常開機會是multi-user.target,即使是要跑UI,也要先有執行multi-user.target,所以一般系統公用service都會掛在multi-user.target。

因為要用/usr/bin/node執行/var/nodejs/server.js,所以要/var/nodejs/裡新增server.js,而範例程式如下:

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(80);


接著事先測試我們的新服務可不可以正常執行:
執行新服務:
sudo systemctl start www.service
看執行的狀況:
sudo systemctl status www.service
sudo netstat -antp,並開網頁連上試試

沒問題就註冊該服務,讓它開機啟動:
    sudo systemctl enable www.servicedisable是不要開機啟動
    PS.基本上這動作就是建立/usr/lib/systemd/system/www.service的soft link到/etc/systemd/system/multi-user.target.wants/下。

最後重開機開機測試是否有正常自動啟動服務:
    重作一次檢查執行的狀況,確認開機又正常啟動www.service

參考資料:
systemd/User: https://wiki.archlinux.org/index.php/Systemd/User
systemd.service — Service unit configuration: http://www.freedesktop.org/software/systemd/man/systemd.service.html
systemd.exec — Execution environment configuration: http://0pointer.de/public/systemd-man/systemd.exec.html
How to set environment variable in systemd service?: http://serverfault.com/questions/413397/how-to-set-environment-variable-in-systemd-service

回應
關鍵字
[此功能已終止服務]
    沒有新回應!





Powered by Xuite