私のRedisデータベースに定期的な天気の更新を取得するために、私が使用しようとしているスキームは次のとおりです
PHPスクリプトは関連するWeather APIから天気を取得します。これは次のようになります
<?php
function getWeather()
{
if (weatherupdaterequired)
{
//weather API call
//parse and store to database
}
}
while (true)
{
getWeather();
sleep(30);
}
?>
これは/usr/local/bin
フォルダに保存されています。同じフォルダにシェルスクリプトrunweather
があります。
#!/bin/sh
Nohup php /usr/local/bin/echoweather.php >/dev/null 2>&1 &
私は通常#!/bin/bash
を使用する傾向がありますが、この例では、起動時に実行すると、以下に示すように#!/bin/sh
のみが機能することがわかりました。これは、まだ利用できないbashシェルと関係があると思います。
次に、runweather
へのシンボリックリンクを作成しました
ln -s /usr/local/bin/runweather /etc/init.d/runweather
そして別のシンボリックリンク
ln -s /etc/init.d/runweather /etc/rc2.d/S99runweather
いくつかの説明ノート
/usr/local/bin/echoweather.php
です。 30秒間隔で実行され、動作していないときはスリープします$redis-
setEx( "weatherreport"、29、$ echoCount) `を配置します。これを使用して、ヘルスを監視できます。echoweather.php
を実行するシェルスクリプトを/usr/local/bin
に配置し、それを/etc/init.d
にのみシンボリックリンクして/etc/rc2.d
に再度シンボリックリンクすると、複雑に見える場合があります。実際のシェルスクリプトを/etc/init.d
に配置し、それを/etc/rc2.d
にシンボリックリンクすると実行されないことがわかったので、これを行いました。このスキームは機能しています。私はサーバーを数回再起動し、redis-cliを介してRedisのweatherreport
キーを探すことにより、echoweather.php
の状態を確認しました-常に存在し、正しい。ただし、Ubuntuの起動スクリプトを扱う場合、私は素人です。おそらく、もっと簡単な方法がありますか?私はコメントすることができるかもしれない誰にでも多くの義務があります。
EOLバージョンのUbuntuを実行していない場合、initシステムはすでにsystemdベースであるため、それを使用するのが正しい方法です。一部の人はType=idle
はサービスユニット用ですが、お願いします:(- systemdのマニュアルページ から):
Simple以外のタイプを使用すると、サービスマネージャがサービスの初期化が完了するのを待つ必要があるため、ブートプロセスが遅延する可能性があることに注意してください。したがって、simple以外のタイプを不必要に使用しないことをお勧めします。 (また、長時間実行されるサービスにアイドルまたはワンショットを使用することは一般的に推奨されないことに注意してください。)
これを考慮して、ターゲットと依存関係を設定することにより、サービスの順序を管理する必要があります。スクリプトが機能するには、少なくとも3つの重要な要件があります。
これらの要件を特定したら、 systemdターゲット を見てみましょう。これにより、必要なもの、必要なもの、依存する必要があるもの、または待機する必要があるものがわかります。
network-online.target
、つまり、ユニットWants
thisであり、After
thisターゲットのみを実行する必要があります。multi-user.target
マルチユーザーシステムをセットアップし、それに必要なものがすべて完了すると終了します。したがって、ユニットはおそらくWants
であり、WantedBy
です。ブートプロセスの後半でユニットを実行したいので、After
を実行すると、このターゲットも必要になります。Requires
Redisが実行され、After
のみをロードする必要があります。それを念頭に置いて、echoweather.service
ファイルを/etc/systemd/system/
このすべてを考慮に入れます:
[Unit]
Description=Gets regular weather updates into my Redis database
Wants=network-online.target multi-user.target
Requires=redis-server.service
After=network-online.target multi-user.target redis-server.service
[Service]
PIDFile=/var/run/echoweather.pid
ExecStart=/usr/bin/php /usr/local/bin/echoweather.php >/dev/null 2>&1 &
Type=forking
KillMode=process
[Install]
WantedBy=multi-user.target
完了したら、デーモンファイルをリロードし、サービスユニットを有効にして、プロセスを実行します。
$ Sudo systemctl daemon-reload
$ Sudo systemctl enable echoweather.service
$ Sudo systemctl start echoweather.service