ユーザー権限で systemd のサービスを稼働させる方法

root権限ではなくて,一般ユーザ権限で systemd のサービスを登録&稼働させる方法です

サービスの登録

systemdのサービスは「ユニットファイル」と呼ばれる設定ファイルに記述します.
ユーザ権限で起動するサービスは ~/.config/systemd/user/ ディレクトリ以下にユニットファイルを配置します.

例えばサービス名を myjob とすると,ユニットファイルのファイル名は ~/.config/systemd/user/myjob.service となります.

ユニットファイルの雛形

ユニットファイルの雛形です.

[Unit]
Description=my job service

[Service]
ExecStart=起動コマンド
ExecStop=/bin/kill ${MAINPID}
Restart=always

[Install]
WantedBy=default.target

ポイントは

  • 起動コマンドは ExecStartで指定
  • 終了コマンドは ExecStopで指定
  • WantedBy=default.target を必ずつけること


例えば python で記述されたスクリプトを systemd経由で起動したい場合は例えば

ExecStart=/usr/bin/python3  /path/to/filename.py  --start --verbose

という風に書けばOKです

上記の雛形ではサービス停止時は kill コマンドでプロセスをkillするように書いてあります.

こちらも例えば

ExecStop=/usr/bin/python3  /path/to/filename.py  --stop

という感じで任意のコマンドが指定できます


より詳しい説明が必要な場合は以下のドキュメントを読むのが良いと思います.

サービスの登録


サービスの有効化

$ systemctl --user enable  myjob

状態確認

$ systemctl --user status  myjob

サービス手動起動

$ systemctl --user start  myjob

サービス手動停止

$ systemctl --user stop  myjob

サービス再起動

$ systemctl --user restart  myjob

ログの確認

$ journalctl --user 
$ journalctl --user -u myjob

サービスの自動起動

デフォルトでは一般ユーザのサービスは該当ユーザがログインした時に自動起動されます.

サーバー起動時に自動起動するには以下のコマンドをroot権限で実行します

$ sudo loginctl enable-linger username

これでユーザ名 username のサービスはシステム起動時に自動起動されるようになります.

jupyter notebook からソースコードだけを抽出する方法

jupyter notebook からソースコードだけを抽出する方法です

2行でまとめると

  • nbconvertを使う方法が定番.でも動作が遅い
  • 20倍以上高速な jq を使う方法がおすすめ

となります.以下,詳細です.

nbconvert を使う方法

input.ipynb からpythonコードを取り出して test.py に保存する場合は以下のコマンドを実行します.

$ jupyter nbconvert --to script input.ipynb  --output test

jq を使う方法

上述の nbconvert は高機能ですが,動作が遅いです.nbconvertはpythonで記述されているためです.

別解として jq を使う方法があります.

$ jq -j '.cells  | map( select(.cell_type == "code") | .source + ["\n\n"] )  | .[][]'   < input.ipynb > test.py


こんなコード,毎回入力できませんね.シェルスクリプトにします

ipynb2py.sh

#!/bin/sh

if [ -z "$1" ]; then
	echo "usage:"
	echo "    $0  input.ipynb"
	exit 1
fi

cat $1 | jq -j '.cells  | map( select(.cell_type == "code") | .source + ["\n\n"] )  | .[][]'   

この内容を ipynb2py.sh という名前で保存します. ipynb2py.sh はPATHが通ってるディレクトリに配置しましょう.これで簡単にjq が利用できます.

ipynb2py.sh の使い方

ソースコードを変換するなら

$ ipynb2py.sh  input.ipynb > test.py

ソースコードをちょっとみるだけなら

$ ipynb2py.sh  input.ipynb 

コードが長い場合は

$ ipynb2py.sh  input.ipynb  | lv

などと実行できます.

jq はどれくらい速いのか?

MacBook(M1)で実行時間を計測しました

nbconvert の場合

real	0m1.221s
user	0m0.845s
sys	0m0.186s

jq の場合

real	0m0.049s
user	0m0.037s
sys	0m0.010s

jq の方が20倍以上高速でした.

ソースコードを見るだけの用途で考えると,1秒以上掛かる nbconvert は処理がもたつくと感じます.個人的には jq 一択です.