趣旨
僕は意図せず初めに最も難しい Systemd を使ってラズパイでbotを実装してたので、どの方法でも難しく感じなかったのですが、サーバーを止めない方法は僕の知る限り4つもありますし、僕も忘れがちなので備忘録を残しておきます。
以下 Systemd を使った例を載せておきます。
nohup コマンド
nohup コマンドは、別のコマンドをバックグラウンドで実行し、ハングアップシグナルを無視するためのPOSIXコマンドです。これにより、ユーザーがログアウトした後もプロセスが継続して実行されます。
daniel@ubuntu:~/telegram$ nohup python test.py &
このコマンドは、test.py をバックグラウンドで実行します。出力はデフォルトで nohup.out にリダイレクトされます。
停止する際には以下のコマンドで process ID を検知して、Killします。
ps aux | grep part_of_process_name_or_command | grep -v grep
kill PID
screen コマンド
screen は一つのターミナルウィンドウやリモートターミナルセッション内で複数の独立したターミナルセッションを使用できるターミナルマルチプレクサーです。ユーザーがログアウトした後もこれらのセッションを生存させ続けます。
新しいセッションを開始するには、単に screen
と入力します。
スクリーンセッション内でスクリプトを通常通り実行します。
セッションからデタッチし、バックグラウンドで実行を続けるには、Ctrl-A その後 d を押します。
セッションに再接続するには、screen -r
と入力します。
tmux コマンド
tmux は screen に似ていますが、より新しく、より複雑な機能セットを持っています。これもまた、セッションからデタッチして後で戻ることができます。
tmux
を入力して新しい tmux セッションを開始します。
tmux セッション内でスクリプトを実行します。
セッションからデタッチするには、Ctrl-B その後 d を押します。
既存のセッションに再接続するには、tmux attach
と入力します。
Systemd サービスを使用する
ルートアクセスがあり、スクリプトをサービスとして実行したい場合(ブート時またはオンデマンドで起動)、systemd サービスファイルを作成できます。
例えば、/etc/systemd/system/my_script.service にサービスファイルを作成し、以下のような内容を記載します。
[Unit]
Description=My Script Service
[Service]
User=daniel
WorkingDirectory=/home/daniel/telegram
ExecStart=/home/daniel/file/env/bin/python /home/daniel/file/test.py
Restart=always
[Install]
WantedBy=multi-user.target
サービスを有効にして開始します。
sudo systemctl enable my_script.service
sudo systemctl start my_script.service
この方法はより複雑ですが、システムの起動とシャットダウンプロセスとの統合により、より多くの制御を提供します。