はじめに
実務にて、Xserver(エックスサーバー)の cron で 1 秒毎に API を実行する PHP ファイルを定期実行してほしいという小仕事の依頼があり、それを解決した情報になります。Xserver の cron 設定は秒指定ができないので、1 秒毎に PHP ファイルを繰り返し実行するシェルスクリプトをバックグラウンド実行させて対応しました。
ソースコード
#!/bin/bash
while true
do
wget -O - -q -t 1 "ここに定期実行する PHP ファイルの URL を記述する。"
sleep 1
done
検証環境
解説
下記のシェルスクリプトをコピペ(コピー&ペースト)して .sh ファイルを作成、サーバーの任意の場所にアップロードします。
#!/bin/bash
while true
do
wget -O - -q -t 1 "ここに定期実行する PHP ファイルの URL を記述する。"
sleep 1
done
while true で無限ループ、do の wget で PHP ファイルを実行、sleep 1 で処理を 1 秒遅延します。つまり、特定の PHP ファイルを 1 秒毎に実行し続けるプログラムです。
次は、エックスサーバーに SSH 接続する為にサーバーパネルにある SSH 設定から SSH を「有効」に切り替えます。さらに、SSH 接続用の公開鍵認証用鍵ペアの生成、または、公開鍵の登録を行います。
公開鍵認証用鍵ペアの生成をする場合、ダウンロードした秘密鍵を .ssh フォルダに保存し、秘密鍵のパーミッションをターミナルから chmod コマンドを実行して変更します。また、各コマンドのドキュメントについては man コマンドから確認ができます。
$ chmod 600 ~/.ssh/xxx.key
ssh コマンドを実行してリモートマシンに SSH でログインします。エックスサーバーの接続ポートは 10022 であることに注意します。
$ ssh ユーザー名@ホスト名 -i ~/.ssh/xxx.key -p 10022
Enter passphrase for key(キーのパスフレーズを入力してください)と聞かれるので、公開鍵認証用鍵ペア生成時のパスフレーズを入力してください。
接続できたら、nohup コマンドと & を実行してシェルスクリプトがログアウトしてもバックグランド実行し続けるようにします。
$ nohup sh /home/xxx/xxx.sh &
ps コマンドを実行してプロセスが存在するか確認しましょう。
$ ps aux | grep xxx.sh
プロセスを停止させたい場合は kill コマンドを実行します。
$ kill プロセスID
以上です。
おわりに
API を実行するプログラムを定期実行する場合は、API のドキュメントをよく読んでリクエスト回数制限にご注意ください。