私のLinuxボックスにはPythonスクリプトによって生成されたファイルがあり、そのファイルは/root/ディレクトリ内にドロップされます。
私の bash スクリプトは次のようになります:
#!/bin/bash
# Run the HR Data feed
cd /root/hr-feed
# the file created here will land one directory above the scripts in /root/
python main.py
# Transfer the file to the server
cd /root/
smbclient \\\\[SERVER]\\[SHARE] --workgroup=[WRKGRP] --user=[USR] [PASS] -c 'put HRDataFeed.txt'
最後の行まではすべて期待どおりに動作します。エラーが発生して実行されているはずです (ただし、そのエラーが何であるかを判断する方法がよくわかりません)。
このジョブは crontab から実行されています。私の理解では、これは root とは少し異なる環境で実行されます (少なくとも動作はそう思われます)。
スクリプトを直接実行すると (crontab からではなく)、問題なく実行され、ファイルは宛先の Windows サーバー ボックスに転送されます。おそらく、put コマンドの一部として HRDataFeed.txt ファイルへのフル パスを指定する必要があると思いますが、それがわかりません。
smbclient .... -c "put /root/HRDataFeed.txt"
ファイルがエラーになる/root/HRデータフィード.txt見つからない。
どのようなご意見でも大歓迎です。
編集
crontabを更新して読み込もうとしました(テストのため、1分ごとに実行していました)
- /root/hrdatafeed > last_run.txt
しかし、ファイルには何も保存されていないようです。
SMBClient コマンドにパイプを直接追加してみます。
答え1
Cronはコマンドが失敗したときにメール( を使用/usr/bin/sendmail
)を送信しようとします。これがスクリプトの実際の出力を取得する唯一の方法です(インストールすることもできます)。sSMTPこれを動作させるのはかなり簡単です)。cron 環境の主な違いは通常 なので$PATH
、があるPATH
ディレクトリを含む crontab で適切な を設定してみてくださいsmbclient
。
答え2
最終的にスクリプトを少し書き直して、次のようになりました。
#!/bin/bash
# Run the HR Data feed
cd /root/hr-feed
python main.py
# Transfer the file to the server
cd /root/
/usr/bin/smbclient \\\\[SERVER]\\HRDataFeed --workgroup=[WRKGRP] --user=[USR] [PASS] -c 'put HRDataFeed.txt'
crontab を次のように変更しました:
- sh /root/hrdatafeed.sh > /root/last_run > 2>&1
最終的に、最後の実行ファイルに意味のあるメッセージを取得できました。エラーはありませんでしたが、これは smbclient コマンドへのフルパスの設定に変更を加えたためだと思います。
この問題を解決するためにご協力いただきありがとうございました。
もちろん、cron タブを更新して、実行頻度を少し下げます ;)