鱧技術

hamo_daisukiの技術メモ

スケジュールによるバックグラウンドサービスの再起動

DistroWatch Weekly, Issue 1061, 11 March 2024 より抜粋
Questions and Answers (by Jesse Smith) (元記事

スケジュールによるバックグラウンドサービスの再起動

Start-over asks: 毎日指定した時間に自動的にサービスを再起動する方法を探しています。ゲームサーバーをホスティングしていて、定期的に再起動させたいのです。ゲームはsystemdユニットで起動しています。

DistroWatchの回答: ほとんどのLinuxディストリビューションBSDファミリーでは、スケジュールされたタスクを実行するツールはcronと呼ばれています。各ユーザは、実行したいタスクとスケジュールされたジョブの開始時刻をリストしたファイルを持っています。この時間とタスクをリストしたファイルをcrontabと呼んでいます。

コマンド "crontab -e "を実行することで、ユーザーアカウント用のcrontabを作成することができます(または既存のcrontabファイルを編集する)。このコマンドを実行すると、テキストエディタが開き、現在のcrontabが表示される。最初はおそらく空白です。

crontabファイルのフォーマットについては、crontabのmanページに概説されています。最も単純な形式では、crontabエントリーは5つの時間パラメーターと1つのコマンドを実行します。5つの時間フィールドは、ジョブを実行したい、分、時間、月、日、曜日を示します。次に、指定された時間に実行されるコマンドが続く。星印(*)は、時刻を常に一致させたい場合の時間フィールドを示します。

この例では、正午(午後12時)の1分後に実行する backup-everything というコマンドを実行します。これを毎月(*)3日に、曜日に関係なく実行します:

    1 12 3 * * /usr/local/bin/backup-everything 

次の例では、同じスクリプトを実行しますが、毎週月曜日の午前3:00に実行します:

    0 3 * * 1 /usr/local/bin/backup-everything 

どちらの例でも、スクリプトへのフルパス名を指定していることにお気づきかもしれません。"backup-everything "ではなく、"/usr/local/bin/backup-everything "と指定しています。これは、cronが実行可能なプログラムやスクリプトを見つけようとする際に、通常のユーザーアカウントと同じパスを使用しないことが多いためです。ほとんどの場合、cronジョブが正しく実行されないのは、パス名が不完全なためです。

元の質問に戻りますが、"game-server "というsystemdサービスがあるとします。このサービスを毎晩午前2時15分に再起動させるには、以下のcrontabエントリーを設定します:

    15 2 * * /usr/bin/systemctl restart game-server 

上記の例では、systemctlプログラムが/usr/binディレクトリにあると仮定しています。systemctlプログラムのフルパスを調べたい場合は、whichコマンドを使ってください

$ which systemctl
/usr/bin/systemctl 

crontabエントリーを作成したら、テキストファイルを保存し、テキストエディタを終了します。これでcrontabが保存され、指定した時間にゲームサーバーが自動的に再起動します。crontabファイルが正しく保存されているか再確認したい場合は、"crontab -l "を実行することで、あなたのユーザーのcrontabファイルの内容を見ることができます:

$ crontab -l
15 2 * * /usr/bin/systemctl restart game-server 

複雑になる可能性があるのは、パーミッションの問題です。通常のユーザーアカウントにゲームサービスを再起動する権限がない場合(またはゲームサービスを起動するのにsudoが必要な場合)、自分のユーザーのcrontabからゲームサーバーを再起動しようとすると失敗します。通常、sudoを使用してサービスを開始する場合、またはゲームサービスを起動するためにrootユーザーを必要とする場合は、自分のユーザーのcrontabではなく、rootユーザーのcrontabを編集する必要があります。

ほとんどのディストリビューションでは、"sudo crontab -e "コマンドを実行することでこれを行うことができます。これにより、ルートユーザーのcrontabが編集され、自分のアカウントの権限制限が回避されるはずです。