8. Ollamaサービスを安定稼働させるための起動スクリプト管理術

手動実行からサービス化への移行が必須な理由

開発初期段階では、ターミナルでollama run ...と手動で実行することが一般的です。しかし、これを本番運用に持ち込むと、セッションが切断されたり、サーバー再起動時にサービスが停止したりするリスクが伴います。安定稼働のためには、OSのサービス管理機構に組み込む必要があります。

systemdによるサービス化の基本概念

Linux環境において、サービスを永続的かつ自動的に管理するための標準的な方法はsystemdを利用することです。Ollamaをサービス化する際は、単にollama serveを実行するだけでなく、依存関係や起動後の処理を定義することが重要です。

サービスファイル(例:ollama.service)を作成し、これをsystemdに読み込ませることで、再起動、自動起動、ステータス確認といった管理機能が利用可能になります。

具体的なユニットファイル作成手順

単なるExecStart=/path/to/ollama serveでは不十分なケースが多いため、以下の要素を考慮した記述が必要です。

セクション 目的 記述すべき内容
[Unit] 依存関係の定義 After=network.target, Requires=network-online.target など、ネットワークが完全に確立してから起動するように指定する
[Service] 実行方法と挙動の定義 User/Groupの指定、Restart=always、WorkingDirectoryの設定が必須
[Install] どのタイミングでサービスを有効化するか WantedBy=multi-user.target を指定し、OS起動時に自動起動させる設定を行う

起動スクリプトの高度な制御(ExecStartPost)

単にサービスを起動するだけでなく、モデルのプリロード(事前ロード)を組み込むことが、体感速度を大きく左右します。これはExecStartPostディレクティブを利用して実現できます。

【構築事例】
起動時に特定のモデルをロードさせる場合、ExecStartPost=/usr/bin/ollama run --quietのようなコマンドを追記します。これにより、サービスが「起動完了」と判断する前に、必要なモデルがVRAM上に確保され、即座に利用可能な状態になります。

このプリロードのタイミングを考慮に入れ、サービスが完全に準備できたと判断する基準(Health Check)を別途設けることが、運用上の大きなポイントとなります。

まとめ:サービス化は「自動化」と「制御」の実現

Ollamaの安定運用は、systemdによるサービス化を通じて、起動の自動化と、ExecStartPostによる初期リソースの事前確保を行うことで、初期応答速度の最適化と信頼性の確保が実現できます。