Xサーバーでcronが動かないの解決法。laravelコマンドも動くよ!

更新日:

Xサーバーでcronを使って、自動的に毎日バックアップしたりしたい。

ただ、Xサーバーのcronの設定って特殊な書き方をしないと、動かないんです。
私もググりまくって各サイトの方法を試しましたが、動かない・・(泣)

 

$: コマンドが見つかりません

ディレクトリではありません

PHP Parse error:  syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in /home/ on line 33

PHP Warning:  Unknown: failed to open stream: No such file or directory in Unknown on line 0
Status: 404 Not Found
X-Powered-By: PHP/7.4.4
Content-type: text/html; charset=UTF-8

No input file specified.

Could not open input file: artisan

誤ったインタプリタです: そのようなファイルやディレクトリはありません

と、何をやってもエラー連発で、cronが動いてくれませんでしたが、
やっと正しい記法が分かり、動くようになったので、解説していきます。

 

Xサーバーでcronを動かす方法。コマンドもこれで動く。

では、Xサーバーのcronを使ってLaravelのデータベースを毎日自動バックアップするというのを例に解説します。

 

私の場合は、

php artisan backup:run --only-db --disable-notifications

というコマンドをcronで決まった時間に実行したかったのですが、
これをそのままXサーバーのcronに書いても動きません。

そこで他サイトで紹介されていたshファイルに記述する方法を使いました。

しかし、shファイルへそのサイトで紹介されていた方法で記述してもやっぱりエラーが出るだけで動いてくれなかったので、書き方を変えました。

 

.shファイルの作成

まず、notepad系のソフト(Terapad, VScodeなど)を開いて以下のように記述します。

コピーしました

コピー

#!/bin/sh
cd yoursite.com/laravel
/usr/bin/php7.4 artisan backup:run --only-db --disable-notifications

#!/bin/sh っていうのは、shを実行してくれっていうコマンドなので、これも必ず書いてください。

cd yoursite.com/laravel というのは、あなたがcronで動かしたいファイル(もしくは実行したいコマンド)の場所です。

私の場合は、このyoursite.com/laravelフォルダ内に移動して、コマンドを実行したいので、普段コマンドラインやSSH接続時に使う cd(ディレクトリ移動コマンド) を書いてます。

 

そして次の行に実行したいコマンドを書くわけですが、

私の実行したいコマンド
php artisan backup:run --only-db --disable-notifications

だったら、このphpをXサーバーでは、/usr/bin/php7.4に書き換える必要があります。
それをやらないと動かないんです。

 

ちなみに、phpのバージョンは人それぞれなので、まず自分のサイトのPHPのバージョンをXサーバーにログインして調べます。Xサーバーのサーバーパネルの「PHP Ver.切替」をチェックして、現在のバージョンがどれなのかチェックします。

そして、「サーバー情報」の「コマンドパス一覧」を見ます。

例えば、私だったら、このphp7.4(CLI)のコマンドを使うわけです。
ちなみにCGIの方のコマンド書いても動いてくれませんでした。

 

改行コードとパーミッションの変更

無事書き終わったら、改行コードをLFにして、dbsave.sh のように、.shで保存してください。

Windowsだと、自動的にCRLFという改行コードになっているので、これをTerapadやVScodeなどのエディタでLFに変更する必要があります。
Neby

 

次に保存したdbsave.shをFTPなどを使って、アップロードします。

アップロード先は今cdで指定したディレクトリ(フォルダ)が良いでしょう。

なので、私だったら、yoursite.com/laravel 内にこのdbsave.shを保存します。

 

保存したら、忘れずに、次は、dbsave.sh のパーミッションを755にします。

パーミッションの変更は、私のようにFTPソフトのプロパティから変更したり、SSH接続でコマンドで変更しても良いでしょう。

 

Xサーバーのcronを設定する

ここまで来たら、後は実際にXサーバーの「cron設定」→「cron設定追加」に以下のように記述します。

私の場合だと、毎日13:48に自動的にコマンドが実行されるという状態です。

コマンドは、

home/yourid/yoursite.com/laravel/dbsave.sh

  • yourid は あなたのXサーバーのサーバーIDに
  • yoursite.com/laravel/の部分は、あなたが今dbsave.shを保存したディレクトリまでのパスに

それぞれ書き換えてくださいね。

ちなみにここにはさっきの/usr/bin/php7.4は書きません。なぜならこのファイルはshであって、phpではないので。
Neby

 

Xサーバーのcron失敗時にエラーメッセージを受信できるようにしよう!

そして、cron設定一覧画面で、通知アドレスも設定しておきましょう。

これを設定すると、cronが動かなかった時にエラーメッセージが来ます。cronが正常に動いた場合もsuccessメッセージが来ます。

 

エラーメッセージが来ないと、「なんでちゃんと動かないんだろう?どこが悪いんだろう?」っていうのが延々分からないので、必ず設定しましょう。
Neby

 

あとは、設定した時間になれば、cronが作動し、通知メールが来ます。

 

現在時刻の1分後に設定すれば、すぐに動いてるか確認できますね。
いや~、これでやっと目的通り、自動的にバックアップがされました。

(ちなみに、今回の私のlaravelのバックアップの場合、storage/app/yoursite/の中に出来てました。)

 

cronのエラーメッセージの意味について軽く解説

$: コマンドが見つかりません

これは、shファイル内に、$マークを書いてしまってるパターンです。$マーク入りません。そんなコマンド存在しないっすよって言ってます。

 

誤ったインタプリタです: そのようなファイルやディレクトリはありません

たぶん、改行コードがCRLFのままアップロードされてます。LFに変更してアップロードしましょう。

 

その他の

ディレクトリではありません

PHP Parse error:  syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in /home/ on line 33

PHP Warning:  Unknown: failed to open stream: No such file or directory in Unknown on line 0
Status: 404 Not Found
X-Powered-By: PHP/7.4.4
Content-type: text/html; charset=UTF-8

No input file specified.

Could not open input file: artisan

これらは、私が

/usr/bin/php7.4-cgi /home/myid/yoursite.com/laravel/ artisan backup:run

のように記述した時に出ました。つまり artisan をコマンドと認識してくれず、「そんなディレクトリ(そんなフォルダ)ねーよ!」って言ってる感じです。スペースありなし関係なく同じエラーがでました。あとcgi版のphpを記述してるのも関係あると思います。

 

質問:Laravel の schedule:run は cronで使わないの?

ちょっと質問があったので、お答えすると、
他のサイトでは、Laravelのバックアップに php artisan schedule:run というLaravel側でスケジュールを自動実行するコマンドを使ってます。

私の場合は、これは使ってません。

なぜかというと、Laravel側でわざわざ自動で毎日実行するように設定しなくても、Xサーバー側のcron自体が、毎日実行されるわけですから、2重にスケジュールを組む方が分け分からなくなると感じたからです。

というか、schedule:run をcronでやろうとすると、

No scheduled commands are ready to run.

っていうエラーが出ます。これは、cron側ではちゃんと実行出来てるけど、動かすスケジュールなんてどこにもないよ!って言ってます。

例えば、Xサーバーcron側で「7時に動かせ」って言ってるのに、laravel schedule 側で「6時に動かせ」って言ってたら、cronは「今動かすスケジュールなんてないやん!」ってなっちゃうって事です。だから結局動かない。

 

なので、手動でバックアップする時に使う、backup:run を直接cronに実行させてるというわけです。

*このbackup:runコマンドは、 spatie/laravel-backup ていうパッケージをComposerでインストールしてないと使えませんので、あしからず。

 

写真で血圧記録

  • この記事を書いた人

Neby

本を毎日多読しつつ、資産運用、プログラミング、心理学、ネットビジネススキルを猛向上中。貧富の差が広がる5年後、10年後に安心生活を送るためのお金のリテラシー、スキル、資産を一緒に作っていきましょう。

-PHP Laravel入門