私は、crontab を使用してプログラム的にサーバー上でいくつかの scrapy スパイダーを実行しようとしています。いくつかのコマンドを試しましたが、最終的にこの crontab は実行されておらず、役立つエラーも表示されません。
#!/bin/bash
PATH=/root/
47 9,22 * * * cd Travel/lastsecond && scrapy crawl tours
この crontab は動作せず、syslog
次のようなメッセージが表示されます:
Feb 13 09:47:01 d4bd CRON[18641]: (root) CMD (cd Travel/lastsecond && scrapy crawl tours)
Feb 13 09:47:01 d4bd CRON[18640]: (CRON) info (No MTA installed, discarding output)
出力は次のようになります:
/bin/sh: 1: scrapy: not found
scrapy をインストールしましたが、コマンドはスタンドアロンで正常に動作しています。
答え1
cron はデフォルトで、実行したコマンドの出力をユーザーにメールで送信します。ただし、MAT (メール転送エージェント) がインストールされていないため、cron はメールを送信できず、コマンドの出力を破棄します。cron 行を次のように変更することで、出力をファイルまたは空白 (/dev/null) にリダイレクトできます。
47 9,22 * * * cd Travel/lastsecond && scrapy crawl tours > outfile 2>&1
または
47 9,22 * * * cd Travel/lastsecond && scrapy crawl tours > /dev/null 2>&1
2 番目の可能性は、MTA (sendmail、postfix など) をインストールし、ローカル メールを処理するように構成することです。
または、スクリプトが出力を生成しないようにすることもできます。
答え2
ファイルscrapy
はどこにも見つかりませんPATH
(下記参照)。ファイルの場所を見つけるには、対話型シェルで次のコマンドを使用します。
which scrapy
絶対パスが表示されます/usr/local/bin/scrapy
。例: crontab への絶対パスを入力します。
47 9,22 * * * cd Travel/lastsecond && /usr/local/bin/scrapy crawl tours
PATH
変数に関して
のPATH
変数は、コマンド ラインまたはスクリプトで正確なパスを指定しない場合にプログラムを検索するために使用されます。これは、プロファイル設定と crontab によっても定義されます。通常は次のようになります。
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
この例は私の からのものです/etc/crontab
。ただし、crontab で指定した値は異常のようです…
PATH=/root/
設定しようとしていませんか?作業ディレクトリここ?!
シェバンについて
シェバン多くのスクリプトの最初の行です。どのインタープリタがファイルを解釈するかを指定します。crontabでは意味がないので削除してください。crontabはデータスクリプトではなく、Cron 用のファイルです。