私のスクリプト(status.sh)は次のとおりです。
#!/bin/bash
SITE=http://www.example.org/
STATUS=$(/usr/bin/curl -s -o /dev/null -I -w "%{http_code}" $SITE)
if [ $STATUS -eq 200 ]
then
echo $STATUS >> /home/myuser/mysite-up.log
else
echo $STATUS >> /home/myuser/mysite-down.log
fi
私は走る:
$ chmod +x /home/myuser/status.sh
それから私のcrontabから次のようになります:
* * * * * /home/myuser/status.sh
私が実行したとき:
$ /home/myuser/status.sh
このファイル/home/myuser/mysite-up.log
には以下が含まれます。
200
ただし、cronが実行されると、ファイルには次のものが/home/myuser/mysite-up.log
含まれます。
000
私は何が間違っていましたか?
編集する: 以下を追加するスクリプトを修正しました。
set -x
@Sobriqueが提案したように、私の結果は次のとおりです。
SITE=http://www.example.org/
/usr/bin/curl -s -o /dev/null -I -w '%{http_code}' http://www.example.org/
STATUS=000
'[' 000 -eq 200 ']'
echo 000
答え1
コマンドラインからスクリプトを実行することとcronで実行することの主な違いは環境です。他の動作が発生した場合は、その動作が環境変数が原因であるかどうかを確認してください。クローン操作は、いくつかの変数が設定されている場合にのみ実行され、これらの変数はログインセッションの値と必ずしも同じではありません(特にPATH
異なる場合が多い)。
環境変数を設定するには、で宣言するか~/.pam_environment
(システムがサポートしている場合)、. ~/.profile &&
cronジョブの先頭に追加します(で宣言する場合.profile
)。また、見ることができます環境変数を設定するための最良の distro/shell 独立した方法は何ですか?
この場合、000
カールの状態はサーバーに接続できないことを示します。通常、ネットワーク接続はシステム全体にわたって行われるため、cronのネットワーキングは同じように機能します。しかし、環境変数が表す1つのことは、プロキシを使用することです。ネットワークに接続するためにプロキシが必要で、http_proxy
セッション起動スクリプトに環境変数を設定した場合、その設定はcronジョブには適用されず、これが失敗する可能性があります。
-S
呼び出しにエラーメッセージを表示するオプションを追加します(他のメッセージは非表示になりますcurl
)。-s
答え2
cronで使用されるカールは、ターミナル/シェルで使用されるカールとは異なる場合があります。フルパスを使用するのではなく、which curl
端末(動作している場所)を確認してから、cronまたはcronによって呼び出されたシェルスクリプトで直接確認してください。curl https://www.example.com/
/home/myusername/anaconda3/bin/curl https://www.example.com/