crontab
root
次のファイルがあります。
lab-1:/var/www/cdd# crontab -l
# do daily/weekly/monthly maintenance
# min hour day month weekday command
* * * * * /etc/scripts/script1
*/15 * * * * /etc/scripts/script2
0 * * * * /etc/scripts/script3
次のコマンドを実行すると、すべてのタスクがトリガーされていることがわかります。
lab-1:/var/www/cdd# cat /var/log/messages | grep cron.info
Mar 15 13:00:00 lab-1 cron.info crond[7897]: USER root pid 26217 cmd /etc/scripts/script2
Mar 15 13:00:00 lab-1 cron.info crond[7897]: USER root pid 26219 cmd /etc/scripts/script3
Mar 15 13:01:00 lab-1 cron.info crond[7897]: USER root pid 26293 cmd /etc/scripts/script1
問題は、script3(script2とscript1が機能することを証明しています)が実際に期待した出力を生成しないことです。別のフォルダにファイルを作成する必要があります。ただし、次のように手動で実行すると正常に動作します。
lab-1:/etc/scripts# bash script3
私は実際にはシステム管理者ではないので、この問題を解決する最善の方法は何であるかわかりません。
最初に思い浮かぶのは特権です。
lab-1:/etc/scripts# ls -lah
total 24
drwxr-xr-x 2 root root 4.0K Mar 15 12:20 .
drwxr-xr-x 34 root root 4.0K Mar 14 17:11 ..
-rwxr-xr-x 1 root root 5.0K Mar 15 12:19 script3
-rwxr-xr-x 1 root root 1.8K Mar 14 15:26 script1
-rwxr-xr-x 1 root root 1.9K Mar 14 15:26 script2
/var/log/messages
しかし... しかし、これが権限の問題であれば、私のファイルでトリガー/起動されたとマークされていますか?
どうすればいいですか?
編集1
lab-1:/etc/scripts# ./script3 | head -n 4
Working folder set to: /tmp/tmp.kOfhip
*****Grab SQL Data from Remote Server: spp.mydomain.net *****
COPY 344
Warning: Permanently added 'spp.mydomain.net,10.1.1.1' (ECDSA) to the list of known hosts.
Evaluate /tmp/tmp.kOfhip/spp.mydomain.net.db
lab-1:/etc/scripts#
編集2
私のスクリプトは次のとおりです
https://paste.pound-python.org/show/90vAlrOsAYP0CtYqNWfl/
ご覧のとおり、一時フォルダを作成し、その中ですべての作業を行っています。
編集3
9行同じ行のせいではないことを自ら証明するために、1~15行を除くすべての項目をコメントアウトしました。これを行う16行を追加しました。
echo "done" >> /tmp/results.txt
その後、作業スケジュールを1時間から始めて、2分ごとに実行するように変更しました。 3回実行されたことがわかります。うまくいかないか爆発するものが見つかるまで、このアプローチを続けているようです。 PATH変数の使用に関する以下の説明はよくわかりませんが、Googleで検索してみたいと思いました。
編集4
script3の結果をファイルに出力するようにcrontabsルートファイルを変更しました。
Working folder set to: /tmp/tmp.GeNGDJ
*****Grab SQL Data from Remote Server: servername *****
COPY 344
Warning: Permanently added 'spp.mydomain.net,10.1.1.132' (ECDSA) to the list of known hosts.
Permission denied (publickey,keyboard-interactive).
Evaluate /tmp/tmp.GeNGDJ/spp.mydomain.net.db
cat: can't open '/tmp/tmp.GeNGDJ/spp.mydomain.net.db': No such file or directory
だからファイルをscpしながら死んだ。リモートSQLが正常に実行され、出力が表示されます。しかし、ご覧のとおり、権限が拒否されましたが、同じコマンドを手動で実行すると機能しているようです。まだ引き続きナビゲートする必要があります。以下の回答で提案されているようにENVをダンプしようとしています。
答え1
後でcronによって実行されるスクリプトを書くときによく犯される間違いは、スクリプトがログインして開発するときと同じ環境を持つと仮定することです。まだではない!
次の行を含むスクリプトを作成します。 4
OFILE=/tmp/crons.environment
(/usr/bin/whoami
/usr/bin/env ) > $OFILE 2>&1
そしてcronが実行するようにしてください。
次に、/tmp/crons.environmentの出力を入力したばかりの出力と比較してみましょう。env
たとえば、スクリプトでは、実行しているすべてのプログラムを見つけるために$ PATHが正しく設定され、データベースもクエリしているとします。これらのコマンドを正しく実行するには、より多くの環境変数が必要になる場合があります。
クローンジョブの出力を確認してください。上記のように、cronが実行するコマンドを一時的に変更し、stdoutとstderrを既知のファイルにリダイレクトします。
0 * * * * /etc/scripts/script3 > /tmp/s3.out 2>&1