本ページはプロモーションが含まれています。

DiscordやSlack(Socket Mode)のボットを作ったものの、エックスサーバーに置いたら動かない、cronで回すと返事が数分遅れる、という状況で悩んでいないでしょうか。原因は単純で、ボットは「決まった時刻に動く処理」ではなく24時間常駐が要る処理だからです。この記事では「常駐が要る」という条件1つに絞り、さくらのVPSと故障ノートPC(Celeron 3205U・メモリ4GB・Ubuntu 24.04・バッテリー取り外し)を使った自宅サーバーのどちらでボットを常駐させるべきかを、2026年10月時点の料金・root権限の要否・停電や再起動からの自動復帰の観点で比べます。systemdで常駐させる今の書き方と、メモリ使用量を自分の環境で測るコマンドもあわせて載せます。

エックスサーバーで常駐ボットが動かない理由:cronと常駐プロセスの違い

ボットは「待ち続ける」処理

Slack の Socket Mode や Discord のボットは、起動するとサービス側とWebSocket(接続を張りっぱなしにして双方向に通信する仕組み)をつなぎ、メッセージが来るのを待ち続けます。プロセスが終了した瞬間にボットはオフラインになります。

一方、cronは「5分ごとに起動して、処理が終わったら終了する」ための仕組みです。スクレイピングで1日1回データを取る処理には向いていますが、待ち続ける処理には向きません。cronで5分ごとにボットを起動し直すと、その間に来たメンションは取りこぼすか、反応が遅れます。

共有レンタルサーバーは常駐プロセスを置く場所ではない

エックスサーバーのような共有レンタルサーバーはWebサイトの配信用に作られており、cronは使えても常駐プロセスは基本的に不可、root権限もありません。cronで処理を回す話は Seleniumはエックスサーバーのcronで動く?26年10月 にまとめましたが、ボットのように常駐が要る処理は最初から候補から外すのが早道です。

置き場所

cron

常駐プロセス

root権限

月額の目安(2026年10月の調査時点)

エックスサーバー(共有)

可

基本的に不可

不可

スタンダード 36ヶ月契約で990円〜

ConoHa WING(共有)

可

基本的に不可

不可

WINGパック36ヶ月で659円〜

さくらのVPS

可

可

可

メモリ2GB・石狩・1ヶ月払いで1,760円

自宅サーバー(手持ちのノートPC)

可

可

可

電気代(構成による)+既存の回線

さくらのVPSの最小プランの料金とメモリ量は、プラン改定があり得るため申し込み前に公式の料金表で確認してください。リージョンは石狩・大阪・東京の3つで、石狩が最も安く東京が最も高い設定です。クレジットカード払いなら14日間の無料お試しがあります。

Slack Socket Mode ボットを systemd で常駐させる今の書き方

以前の書き方:nohup・screen・cron の @reboot

以前は次のような書き方がよく使われていました。

nohup python3 bot.py > bot.log 2>&1 &
# 再起動後も動かしたいので crontab に
@reboot cd /home/username/bot && python3 bot.py

これは「起動する」ことはできても、ボットが例外で落ちたときに起こし直す仕組みがありません。夜中に接続が切れて例外で終了すると、朝まで誰も気づかないまま止まります。

今の書き方:systemd のユーザーサービスに Restart=always

Ubuntu 24.04 では、OS標準の systemd(プロセスの起動・監視を行う仕組み)に任せるのが今の書き方です。落ちたら自動で起こし直し、再起動後も自動で立ち上がり、ログも journalctl でまとめて見られます。VPSでも自宅のノートPCでも同じ手順で動きます。

実行環境:Ubuntu 24.04 に標準で入っている Python 3(バージョンは python3 -V で確認)。パッケージは仮想環境に入れます。

mkdir -p /home/username/bot && cd /home/username/bot
python3 -m venv .venv
.venv/bin/pip install slack_bolt
.venv/bin/pip show slack_bolt   # 入ったバージョンを確認しておく

Ubuntu 24.04 ではシステムのPythonに直接 pip install すると拒否されるため、仮想環境(.venv)を作ってそこへ入れます。バージョンを固定したい場合は pip show で確認した値を requirements.txt に書いておくと、別のサーバーへ移すときに同じ環境を再現できます。

ボット本体(bot.py):

import os
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

app = App(token=os.environ["SLACK_BOT_TOKEN"])

@app.event("app_mention")
def on_mention(event, say):
    say(f"<@{event['user']}> 受け付けました")

if __name__ == "__main__":
    SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()
  • 1〜3行目:Slack公式のPythonライブラリ Bolt と、Socket Mode 用のアダプタを読み込みます。
  • 5行目:ボットトークンは環境変数から読みます。コードに直接書くと、ファイルを共有したときにトークンも一緒に漏れます。
  • 7〜9行目:ボットへのメンションを受けたら返信します。実際の処理(スクレイピングの結果を返す等)はここに書きます。
  • 11〜12行目:Socket Mode で接続し、そのまま待ち続けます。この start() が返らないことが「常駐」の正体です。

トークンは別ファイル /home/username/bot/.env に置き、自分だけが読めるようにします。

SLACK_BOT_TOKEN=xoxb-ここに自分のボットトークン
SLACK_APP_TOKEN=xapp-ここに自分のアプリトークン
chmod 600 /home/username/bot/.env

systemd のユニットファイル ~/.config/systemd/user/slackbot.service:

[Unit]
Description=Slack bot (Socket Mode)
StartLimitIntervalSec=600
StartLimitBurst=10

[Service]
WorkingDirectory=/home/username/bot
EnvironmentFile=/home/username/bot/.env
ExecStart=/home/username/bot/.venv/bin/python bot.py
Restart=always
RestartSec=30

[Install]
WantedBy=default.target
  • Restart=always:例外で落ちても、ネットワーク断で終了しても起こし直します。nohup との最大の違いはここです。
  • RestartSec=30:起こし直す前に30秒待ちます。0にすると、接続先が落ちているあいだ毎秒接続し直すことになり、相手にも自分のログにも負担をかけます。
  • StartLimitIntervalSec / StartLimitBurst:10分間に10回失敗したら再起動をあきらめます。トークンの失効のように何度やっても直らない失敗で無限に回り続けるのを防ぎます。
  • EnvironmentFile:先ほどの .env を環境変数として渡します。

有効化:

systemctl --user daemon-reload
systemctl --user enable --now slackbot.service
sudo loginctl enable-linger username
systemctl --user status slackbot.service

3行目の enable-linger が抜けると、SSHからログアウトした瞬間にユーザーサービスごと止まります。ログインしていないときも動き続けさせるための設定で、ここだけ一度 sudo が要ります。Discordのボット(discord.py など)も、ExecStart を差し替えるだけで同じユニットで常駐させられます。

root権限はどこで要るのか

作業

root(sudo)が要るか

仮想環境の作成・pip install

不要

ユーザーサービスの作成・起動・停止

不要

loginctl enable-linger

要(最初の1回だけ)

OSの更新(apt upgrade)

要

自宅PCのスリープ無効化・フタ閉じ設定

要

共有レンタルサーバーで常駐ボットが作れないのは、この enable-linger やプロセスの常駐そのものが許されていないためです。VPSと自宅サーバーはどちらもroot権限があるので、この点では差がありません。

メモリ使用量と自動復帰を測る:さくらのVPSとCeleronノートPCで同じ手順

ボット1本がどれだけメモリを使うかは、ライブラリや処理内容で大きく変わります。カタログの数字ではなく、自分のボットを動かして測るのが確実です。VPSでも自宅PCでも、次の同じコマンドで比べられます。

メモリ使用量の測り方

# サービス全体のメモリ(Memory: の行を見る)
systemctl --user status slackbot.service

# プロセス単位の常駐メモリ(RSS、単位はKB)
ps -o pid,rss,cmd -C python

# マシン全体の空き
free -h

見るべきは、ボットのメモリ使用量そのものより「マシン全体の available がどれだけ残るか」です。Celeron 3205U・メモリ4GBのノートPCでも、Xubuntuのデスクトップを動かしたままだと画面まわりのプロセスがメモリを使います。ボットのほかにSeleniumで Chrome を起動する処理を同居させると、一気に余裕がなくなります。逆にボット単体なら、どちらの環境でもメモリが足りなくなることはまずありません。

自動復帰の確かめ方(3段階)

  1. プロセスが落ちたとき:systemctl --user status でPIDを確認し、kill -9 PID で強制終了します。RestartSec で指定した30秒後に新しいPIDで立ち上がっていれば成功です。
  2. OSを再起動したとき:sudo reboot 後、ログインせずに数分待ってからSlackでメンションを送ります。返事が来れば linger とサービスの有効化が効いています。
  3. ログの確認:journalctl --user -u slackbot.service -n 50 で、落ちた理由と再起動の記録が残っているかを見ます。

再起動のあとは、systemctl --user is-enabled slackbot.service も確かめてください。電源断のような異常終了のあと、ユニットファイルは残っているのに有効化のリンクだけが外れて、エラーも出ずに止まっていることがあります。

停電で差が出る:バッテリーを外したノートPCの弱点

状況

さくらのVPS

自宅ノートPC(バッテリー取り外し・AC駆動)

ボットの例外終了

Restart=always で自動復帰

同じく自動復帰

OSの再起動

自動復帰

自動復帰

停電・コンセント抜け

データセンター側の電源設備で守られる

即座に電源断。電源が戻っても自分で電源ボタンを押すまで止まったまま(BIOSに通電時自動起動の設定がある機種なら解消できる)

事業者側のメンテナンス

事前告知のうえ停止することがある

なし(すべて自分の都合で決められる)

フタを閉じる・スリープ

関係なし

設定しないと止まる(下記)

ノートPCをサーバーにする場合、スリープの無効化が前提です。次の2つを両方設定しないと、フタを閉じたときや省電力機能でボットごと眠ります。

sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
# /etc/systemd/logind.conf の HandleLidSwitch=ignore を有効にしてから
sudo systemctl restart systemd-logind

バッテリーを外したノートPCは、実質的にUPS(停電時に電気を供給する装置)を持たないデスクトップと同じです。停電があれば必ず止まり、ディスクへの書き込み中だった場合はファイルが壊れることもあります。ボットのように「止まっても再開すれば済む」処理なら許容できますが、書き込みの多いデータベースを同居させるならUPSを用意するか、VPSに置くべきです。

なお、さくらのVPSが2026年8月1日から始めた品質保証(SLA)は、メモリ4GB以上かつV5以上のLinuxプランが対象です。最小クラスのプランは対象外なので、「VPSなら止まらない保証がある」と考えないでください。

月額と止まる条件で選ぶ:常駐ボットの置き場所の結論

Socket Mode と Discord ボットはポート開放が要らない

自宅サーバーの最大の壁は、グローバルIPの取得やポート開放です。ところが Slack の Socket Mode も Discord のボットも、ボット側から外へ接続しにいく仕組みなので、外から自宅へ入ってくる通信を受ける必要がありません。ルーターの設定も、固定IPも要りません。この条件に限っては、自宅サーバーの一番の難所が丸ごと消えます。逆に、Webhook(相手のサービスから自分のURLへ通知を送ってもらう方式)でボットを作るなら、外から届くURLが要るためVPSのほうが圧倒的に楽です。

止まる条件の比較

置き場所

月額の目安

止まる条件

向いている人

手元のPC(普段使い)

0円

スリープ・シャットダウン・持ち出し・OS更新の再起動

動作確認だけしたい人

共有レンタルサーバー(エックスサーバー等)

990円〜(36ヶ月契約)

そもそも常駐できない

ボットには不向き。cronの定期実行なら可

さくらのVPS

メモリ2GB・石狩で1,760円(1ヶ月払い)

事業者のメンテナンス、支払い忘れ

停電を気にせず確実に動かしたい人、Webhook方式の人

自宅の余ったノートPC

電気代のみ(構成による)

停電・コンセント抜け・ハードの故障・回線断

Socket Mode/Discordボットで、止まっても翌日直せば済む人

他社のVPSでは、調査時点でXServer VPSのメモリ2GBクラスが1ヶ月契約1,980円、ConoHa VPSのメモリ2GBクラスが1ヶ月契約の更新後で1,259円(月間稼働率99.99%のSLAを明記)でした。KAGOYA CLOUD VPSはメモリ2GBで月額上限770円と安い部類ですが、2026年10月19日から新規申し込みを一時停止していると案内されています。海外のAWS Lightsailは月額$5〜ですが、インスタンスを停止しても課金が続く点に注意が必要です(止めるにはスナップショットを取ってから削除する)。

私の結論

  • Socket Mode/Discordのボットで、数時間止まっても困らないなら、余っているノートPCで十分です。ポート開放が要らず、月額は電気代だけで済みます。
  • 業務で使う・夜間に止まると困る・Webhook方式なら、さくらのVPSなど月1,000〜2,000円台のVPSに置きます。停電と回線断を自分で抱えなくて済むことに払う費用です。
  • どちらでも、systemd の Restart=always と linger の2つは同じように設定します。置き場所を後から移しても手順が変わらないので、まず自宅で動かし、困ったらVPSへ移すという順番でも損はありません。

同じ比較を「毎日決まった時刻にSeleniumを動かす」条件で行った記事は Selenium毎日実行 VPS・自宅・共有比較|26年10月 にあります。ボットと定期実行の両方を同じマシンに載せる場合は、メモリの見積もりにこちらも合わせてください。

接続先サービスと取得先サイトへの配慮:再接続間隔とアクセス間隔

常駐させる処理は、止まらないぶん相手に与える影響も止まりません。次の点は置き場所によらず守ってください。

  • 再接続の間隔を空ける:RestartSec を0にしない、StartLimitBurst で上限を決める。接続先が障害中に毎秒つなぎ直すと、相手の復旧を妨げます。
  • APIの利用制限を守る:SlackやDiscordのAPIには呼び出し回数の制限があります。制限に当たったら、返ってきた待ち時間に従って待ちます。複数アカウントやIPを使い分けて制限を超えるような作りにはしません。
  • ボットからスクレイピングする場合:取得先の robots.txt と利用規約を先に確認し、禁止されているページは取りに行きません。メンションのたびにサイトを取りに行く作りだと、使われ方次第でアクセスが集中するので、取得結果をキャッシュして一定時間は再取得しない、1リクエストごとに数秒以上空ける、といった間隔を設けます。
  • トークンを外に出さない:.env は chmod 600 にし、Gitの管理対象から外します。自宅サーバーは盗難や持ち出しの可能性もあるので、VPS以上に気を配ります。

関連する選択肢

毎日決まった時刻にスクリプトを動かすだけなら、共有のレンタルサーバーでも足ります。cronが使えるプランを選べば、自分でOSを管理する必要はありません。

レンタルサーバー エックスサーバー

※ 広告を含みます(A8.net)。リンク経由でお申し込みがあった場合、手数料を受け取ることがあります。

まとめ:常駐ボットは「止まったとき誰が困るか」で置き場所を決める

DiscordやSlack(Socket Mode)のボットは24時間常駐が要るため、エックスサーバーのような共有レンタルサーバーでは動かせません。候補はroot権限を持てるVPSか自宅サーバーで、どちらでも systemd のユーザーサービスに Restart=always を付け、loginctl enable-linger でログアウト後も動き続けるようにするのが今の書き方です。Socket Mode とDiscordボットは外から接続を受けないので、自宅サーバーでもポート開放は要りません。差が出るのは停電で、バッテリーを外したノートPCは電源断で即停止し、通電時の自動起動が無ければ手動で電源を入れるまで止まったままです。止まっても翌日直せば済むなら電気代だけの自宅PC、業務で止まると困るならさくらのVPS(メモリ2GB・石狩で月1,760円)を選び、メモリと自動復帰は記事内のコマンドで自分のボットを使って実測してから決めてください。