Systemdを使った Edisonでプログラムを自動起動する方法

▼Systemd(systemctl)について

Linuxでは古くから自動起動プロセスにかんして init.d を使用する事があり、 init.d の仕組みや管理は魔術の様に難しく、その魔術を簡易に管理する為のプログラムが多数出てきたりしてました。

そんな中、2011年頃からinit.dに代わる起動プログラムとしてsystemdが急激に流行りだし、 今までの魔術的処理を行ったinit.dから、言語化され文明の力を持ったsystemdを使用することになりました。

https://ja.wikipedia.org/wiki/Systemd

勿論、Linuxで動いているEdisonも例外でんはなく、Edisonの中に標準でsystem.dが起動プロセスを制御しています。

ここではEdisonで自作プログラムを自動起動するための方法をまとめます。

▼自動起動するための準備

まず、自動実行したいプログラムが正常に動いているかを確認してください。

自動実行のプログラムを走らせますと、起動しなかった際の原因を調べることは大変難しいです。

特に多いミスが、そもそも設定したコマンドが動かないということです。

例として

python main.py

と行ったプログラムがあるとしたら、これでは動作しません。

pwd コマンドを使い、現在のディレクトリをフルパスで指定します。

python /home/<user名>/main.py

この状態で実行して、上手く動作するのであれば起動スクリプトを記述しても動く様な気がします。

ここが一番ミスをしやすい箇所なので、自分に言い聞かせるように強くおすすめします。

▼systemd用のスクリプト作成

Systemdのフォルダにサービスファイルを作成します。

sudo nano /lib/systemd/system/<ご自由に>.service

以下の内容を記述します。

[Unit]
Description = Test

[Service]
ExecStart=python /home/<user名>/main.py
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target

こんな感じになります。

注目点は、

[Service]
ExecStart=python /home/<user名>/main.py

です。

ExecStartは実行するコマンド名です。ここで、先ほどのフルパスで実行したコマンドを貼り付けます。

より細かなsystemdの記述を行いたい方は、以下のサイトが大変判りやすくオススメです。

http://enakai00.hatenablog.com/entry/20130917/1379374797

▼サービスの実行

以下のコマンドでサービスを実行します。

systemctl start <先ほど決めたファイル名>.service

これでプログラムが無事に実行されれば良いです。

特にコマンドプロントに文字が表示されないので、以下のコマンドで確認します

systemctl status <先ほど決めたファイル名>

で状態を確認することが出来ます。

もしエラー表示があれば英文を読み一個ずつ対処するしかありませんが、 自分の経験上大半の問題は先のフルパスが上手く出来ておらず、コマンドがそもそも動かない点ですね。

ここで、プログラムを間違えた!変更したい!って時は、一度サービスと停止させます。

systemctl stop <先ほど決めたファイル名>.service

で、プログラムを書き換えて、再度試したい際は、前のstartを実行すればOKです。

この3つのコマンドの繰り返しでデバックを進めていきます。

▼サービスの自動起動の設定

実は、前の3種類のコマンドはOSが起動後の制御コマンドになり、自動起動するようにしたというコマンドではありません。

(自分は良く間違えてstart出来るのに自動起動しない。何でな?って首をかしげます)

以下のコマンドで、自動起動するように設定できます。 (自動起動を指示するコマンドは別なんですよ)

systemctl enable <先ほど決めたファイル名>.service

これで起動時に自動起動が出来るように成ります。

おもむろに、

sudo reboot

これで再起動して、起動時のパラパラに自分のサービスが表示されるはずです(早すぎて見えませんが)

起動後、ちゃんと動作しているかは先程の status で状態を確認することが出来ます。

以上!

▼ 最後に

自動起動については以上です。覚えることは少ないでしょう、自分としても書くことが少なくて大変有り難いです。

実は、systemdが登場する前のinit.dについて記事をまとめると途方もない量(実際にinit.dだけの本が出ている)になるので、

2011年より登場したsystemdが流行る理由が物凄くわかります。みんな苦労してたんだ・・・

起動プロセスに関してはLinux固有の内容が多く含まれますので、できればその辺りも調べつつ知りつつ行っていただきたいですが、 systemdの様に簡単にサービスを登録できる機能もありますので、エイヤ!っと試して頂ければと思います。

それでは。




2017/10/29 初版