crontab でスクリプトが動作しない

crontab でスクリプトが動作しない

再起動するたびに Minecraft サーバーを起動するスクリプトがあります。ログを見ると、cmd が呼び出されていることがわかりますが、画面は開かれていません。スクリプトを手動で実行すると、/home/minecraft/scripts/startMinecraft.sh完璧に動作します。

これが私のcrontabです:

@reboot /home/minecraft/scripts/startMinecraft.sh
38 00,06,12,16 * * * /home/minecraft/scripts/backup.sh

CentOS 6 サーバーです。

これが私のstartMinecraft.shスクリプトです。

screen -A -m -d -S minecraftserver /home/minecraft/scripts/startServer.sh

前にも言ったように、その行を正確に手動で実行すると、完璧に動作します。

答え1

cron ジョブが実行されると、ターミナルまたは SSH 経由でログインするときにユーザーが設定するのと同じ方法で $PATH 値が設定されないため、バイナリのフルパスを設定する必要がある可能性がありますscreenStack Overflowのこの回答取引全体についての適切な説明です。

したがって、スクリプトを次のように変更することをお勧めします。

screen -A -m -d -S minecraftserver /home/minecraft/scripts/startServer.sh

これに対して:

/path/to/screen -A -m -d -S minecraftserver /home/minecraft/scripts/startServer.sh

そして、/path/to/screen実際のフルパスに置き換えます。これは、次のように簡単に取得できます。whichこのような:

which screen

出力は次のようになります。

/usr/bin/screen

または、次のようにスクリプト内に実際に配置して $PATH を設定することもできます。

PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

もちろん、これはシステム上の実際の PATH 値と一致する必要があります。これは次のように入力して取得できます。

echo $PATH

しかし、個人的には、よりクリーンなフルパス方式を好みます。また、$PATH 値は頻繁に変更されるため、Bash スクリプトでさまざまな値が混在することは望ましくありません。

PS: また、ちょっとしたことですが、Bashスクリプトでは実際のBashインタープリタの値が設定されている必要があります。「シバン」上部にこのように記述すると、スクリプトは次のようになります。

#!/bin/bash
/path/to/screen -A -m -d -S minecraftserver /home/minecraft/scripts/startServer.sh

もちろん、/bin/bash実行することでシステムの実際の Bash パスと一致するはずですが、最新のインストールではパスwhich bashに含まれない可能性は低いと思います。/bin/bash

関連情報