2017-03-01 23 views
-1

EC2インスタンスcrontabとslack-cleanerを使用して、48時間を超えるすべてのSlackメッセージを削除します。bashスクリプトがシェルで実行され、crontabに「not found」エラーが表示される

for CHANNEL in random general 
do 
slack-cleaner --token <MY TOKEN> --message --channel $CHANNEL --user "*" --before $(date -d '48 hour ago' "+%Y%m%d") --perform 
done 

は、その後、私はそれが私が一度タイミングを変更します働くたら(それを毎分を実行するためのcrontabのラインを作成しました:これを行うには、私は(私は私のたるみAPIトークンを削除した)delete_slack.shを作成しました日)とcronがログファイルに結果を吐き出すた:テストするには

* * * * * /home/ubuntu/delete_slack/delete_slack.sh >> /var/log/delete_slack.log 2>&1 

、私はシェルでsh /home/ubuntu/delete_slack/delete_slack.sh >> /var/log/delete_slack.log 2>&1を実行し、それが正常に動作します。しかし、私がcrontabを実行させると、ログファイルにエラーが表示されます。

/home/ubuntu/delete_slack/delete_slack.sh: 3: /home/ubuntu/delete_slack/delete_slack.sh: slack-cleaner: not found 

アイデアはありますか?私はこの午後すべてに頭を叩きました。

答えて

3

あなたはcron経由で取得したPATHのように聞こえ、ログイン時に取得したPATHは異なっています。

どちらかは、あなたのスクリプトでPATHを設定するか、PATHが(スクリプトを含む)の実行可能ファイルを検索するディレクトリシェルを伝えslack-cleaner

への絶対パスを使用します。 echo $PATHで、cronが提供するパスとパスを比較し、これが問題であることを確認できます。

絶対パスを使用するのが最も簡単ですが、slack-cleanerが他のexes自体を使用する場合は、パスを設定する方が良い場合があります。

"PATHの変更"方法を使用する場合は、既存のPATHに正しいパスを追加し、完全に上書きしないようにします。すなわちexport PATH=$PATH:/path/to/slack-cleaner-dirである。 which slack-cleanerを使用して、正しいパスを見つけることができます。注:ディレクトリに「スラッククリーナー」を付けないでください。

+0

あなたの「スクリプトのPATHを設定する」とは何を意味するのですか? – Anton

+0

export PATH = $ PATH:/ path/to/dir/of/slack-cleaner'(明らかに、最後に余裕のあるクリーナーが必要です。これはシェルがどのディレクトリに実行可能ファイル/スクリプトを検索するかを指示します。 '$ PATH:... 'を使って、既存のパスに追加します。 – John3136

+0

これはそれでした。完璧なおかげです。理由は、 "slack-cleaner"がanacondaの環境にインストールされているが、cronは明らかに別のpython環境を使用しているため、 "slack-cleaner"を見つけることができなかったからです。生活し、学びます。 – Anton

1

いつでもcronでフルパスを使用すると、時間を大幅に節約できます。 export PATH=...が好きではない場合は、代わりに/path/to/slack-cleaner-dirを使用してください。

+0

このようなことを意味しますか?/ home/anaconda3/slack-cleaner --token --message --channel $ CHANNEL --user "*" --before $(date -d '48 hours ago '"+ %Y%m%d ")--perform'? – Anton

+0

正しい。 commend行に記載されている他のファイルが完全なパスを持っていることを確認してください。 $ CHANNELがファイルを表していても、変数の内容に完全なパスを追加してください。あなたは本当に多くの時間を節約します。 – Putnik

+0

'$(date ...'ではなく '$(/ bin/date ...) – Putnik

1

ちょうどあなたがあなたのシェルから起動したときとまったく同じような状況にあるとのコマンドを実行する前に、自分のプロファイルをロード:私はあなたがここに、これに少し慣れていていることを読んで

* * * * * . ~/.profile;/home/ubuntu/delete_slack/delete_slack.sh >> /var/log/delete_slack.log 2>&1 

プロファイルに関するもう少し説明: プロファイルは、あなたのユーザーとシェルで接続すると自動的に読み込まれるファイルです。 ファイルそれを見て、自分のホームディレクトリに隠された、あなたが起動することができます:

ls -la ~ 

あなたはbashにしている場合は、ファイルはあなたがshellまたはkshにいる場合、それは意志、.bash_profileという名前になります。名前は.profile

希望しました!

関連する問題