cronを使用してPythonスクリプトを指定した時間に自動実行します。cronの設定方法を次に示します。
1.書式
各項目はスペースを開けて記載します。
分 時 日 月 曜日 コマンド
2.設定値
カラム | 意味 |
---|---|
分 | 0~59の値で指定し、*を指定した場合、毎分となります。 |
時 | 0~23の値で指定し、*を指定した場合、毎時となります。 |
日 | 1~31の値で指定し、*を指定した場合、毎日となります。 |
月 | 1~12の値で指定し、*を指定した場合、毎月となります。 |
曜日 | 0~7の値で指定し、*を指定した場合、毎日となります。 |
コマンド | 実行するコマンドやシェルスクリプトを指定します。 |
下記のような書き方もできます。
◆複数指定 ⇒ カンマで区切ります。「0,30」
◆範囲指定 ⇒ ハイフンを使用します。
8時~12時の0分、30分にconst.pyを実行
00,30 8-12 * * * python /home/const.py
◆間隔 15分毎にtest.pyを実行します。
*/15 * * * * python /home/test.py
◆ 起動時に毎回、boot.pyを実行します。
@reboot python /home/boot.py
3.crontabによる設定
下記のコマンドでcrontabを起動し、定期実行したい時間とそのスクリプトを書き込み設定を行います。設定した内容は、そのユーザ権限で実行されます。
$ crontab -e
実行する日時を指定して、実行するpythonファイルのパスを絶対パスで指定します。pythonを実行するには最初に「python 」、その後にファイル名を記述します。なお、cronのエラーログは、/var/log/syslogに出力されます。cronで実行するスクリプトには実行権限が必要です。
4.1行で済むシェルコマンドの書式
指定するシェルコマンドは、次のように一行に記述して、条件に応じたコマンドや複数コマンドが実行できます。
- 「ls hello.txt || echo “Hello!” > hello.txt」
- hello.txtが存在しなければ、文字列”Hello!”をhello.txtに出力して生成
- 「ls hello.txt && rm -f hello.txt」
- hello.txtが存在したら、hello.txtを削除
- 「[ -f hello.txt ] || echo “Hello!” > hello.txt」
- [ -f hello.txt ] は “hello.txtが存在しない場合はファイルを作成
- 「ls hello.txt; cp hello.txt yeah.txt」
- hello.txtの有無を確認し、その結果に関わらずhello.txtのコピーをyeah.txtとして生成
- 「ps aux | grep ntpd」
- プロセス一覧リストを出力して、そのうち”ntpd”が含まれる行を出力
5.Pythonスクリプトの作成
cronで呼び出すPythonスクリプト「trigger.py」を作成します。
import requests def main(): response = requests.post( 'http://xxxx/get.php') print response.text if __name__=='__main__': main()
次の設定によりcronで1分ごとに、作成したPythonスクリプト「trigger.py」を呼び出します。
$crontab -e * * * * * python /home/trigger.py
cronが動作しているかを次のchkconfigコマンドを使って確認します。
$ sudo apt-get install chkconfig $ sudo chkconfig cron cron on
<参考>
Pythonスクリプト「trigger.py」で呼び出される「get.php」を次に示します。サーバ変数「$_SERVER[“REMOTE_ADDR”]」を使って呼び出し側のIPアドレスを取得するスクリプトで、前回の通知と異なっていればメールで通知します。
<?php $ipAddress = $_SERVER["REMOTE_ADDR"]; echo date("Y-m-d H:i:s")." ".$ipAddress."<br>"; if($ipAddress!==file_get_contents(IPadr.txt, NULL, NULL, 20)){ file_put_contents ( IPadr.txt, date("Y-m-d H:i:s")." ".$ipAddress ); mb_send_mail("XXXXXXX@xxxx", "", $ipAddress, "From: globalIP@com"); } ?>
サーバ変数「$_SERVER」の一覧を次に示します。
変数名 | 説明 |
---|---|
$_SERVER['SERVER_NAME'] | 現在のサーバーのホスト名 |
$_SERVER['REQUEST_URI'] | ページにアクセスする際に指定されたURI(ドメイン以下のパス) |
$_SERVER['REQUEST_METHOD'] | 現在のページにアクセスする際に使用されたメソッド |
$_SERVER['DOCUMENT_ROOT'] | 現在実行されているスクリプトのドキュメントルートディレクトリ(ドメインルート) |
$_SERVER['SCRIPT_FILENAME'] | 現在実行されているスクリプトの絶対パス |