SSH シェルでは .sh スクリプトが正常に動作するのに、PHP または crontab では実行できない原因は何ですか?
ゲームサーバーを実行している VPS を持っていますが、それを保守可能にするために、面倒なプロセス (サーバーのセットアップまたは削除など) の多くを自動化し、重要な機能 (サーバーの開始および停止など) を簡単にすることを計画しています。本当に必要としている人には受け入れられます。
さて、シェル スクリプトを作成してテストしたところ、まったく問題なく動作しました。startserver はサーバーを起動し、restartserver はサーバーを再起動しました。しかし、PHP から実行した場合、または後でわかったように、crontab でサーバーを起動しても魔法のように機能しません。それらを停止し、実行されているかどうかを確認し、更新し、他のすべての機能が意図したとおりに機能しましたが、サーバーを起動しても何もしませんでした. 何も出力せずに0を返しました。
たとえば、どちらの場合でも機能するスクリプトの例を次に示します: (statusserver.sh)
/sbin/start-stop-daemon -v -t --start --exec ~mta/servers/$1/files/mta-server -- -d
そして、これはいずれの場合も機能しないものです: (startserver.sh)
/sbin/start-stop-daemon -v --start --exec ~mta/servers/$1/files/mta-server -- -d
唯一の違いは、statusserver.sh に "-t" が含まれていることです。これは、-t なしで同じコマンドを実行すると実際に成功するかどうかのみを示します。そして、次のように statusserver.sh を実行します。
sudo -u mta ~mta/sh/statusserver.sh test
確かに機能し、「Would start ~mta/servers/test/files/mta-server -d」の行に沿って何かを出力します。しかし、これを行う:
sudo -u mta ~mta/sh/startserver.sh $2
絶対に何もしません。何も出力せず、実際には 0 を返します (これは、操作が成功したことを意味するはずです)。
楽しい部分: サーバーが既に実行されている場合、startserver.sh は本来の処理を実行します。つまり、サーバーが既に実行されており、エラー コードを返しているとします。(start-stop-daemon は私のためにそれを行うのに十分親切だからです) しかし、それは何も起動することを完全に拒否します。
start-stop-daemon を次のように置き換えます。
sudo -u mta ~mta/servers/test/files/mta-server -d
まったく同じことを行います: 実行を拒否するだけで、0 を返します。
ところで、それは sudo の問題ではありません。以下もうまくいくので、私はかなり確信しています
sudo -u web1 sudo -u mta ~mta/scripts/startserver.sh test
私の質問に戻ります: Linux、Shell、Bash などが、PHP または crontab を介して実行されたときにアプリケーションの起動を完全に拒否し、SSH を介して起動されたときに喜んでそれを受け入れる原因は何ですか? 切り替える必要のある設定はありますか? 私がやりたいことを妨げている可能性のあるパッケージはありますか? 私が見逃している他のものはありますか?