コマンドラインから実行するときに動作するスクリプトがありますが、それを使用してスケジュールすると、ファイルまたはcron
コマンドが見つからないというエラーが発生します。私の質問は2つあります。
cronジョブのスケジュールに使用するときは、
crontab -e
権限の基礎として私のユーザーIDを使用しますか?それとも、ある種のcronユーザーIDと関連する権限を使用しますか?クローンジョブの開始時に作業ディレクトリは何ですか?実行するスクリプトを指定するディレクトリですか、それとも別のディレクトリですか?
これは私のクローンの仕事です。
15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh
実際のスクリプトは次のとおりです。
vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp [email protected] < emailmsg.txt
mail
以下は、生成されたメッセージを表示したときに表示されるエラーですcron
。
sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found
見つかりませんが、template.txt
スクリプトと同じディレクトリにあります。また、動作しませんが、ssmtp
ユーザーとして行うことができます。これを行うために私は何を見逃していますか?
答え1
cd /home/xxxx/Documents/Scripts/
このディレクトリでタスクを実行するには、追加してください。 cronが特定のディレクトリに変更される理由はありません。 Cronはホームディレクトリからコマンドを実行します。
それはssmtp
あなたのデフォルトではないかもしれませんPATH
。 Cronのデフォルトパスは実装によって異なりますので、マニュアルページを確認してください。ただし、デフォルトパスではなくルートにのみssmtp
存在する可能性が高いです。/usr/sbin
PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
15 7 * * * cd /home/xxxx/Documents/Scripts && ./email_ip_script.sh
答え2
cronjobがbashスクリプトの場合、次はスクリプトの場所のCDです(cron定義で絶対パスを使用すると仮定)。
cd "$(dirname "$0")";
答え3
質問1への回答:crontab -e
自分のユーザーとして実行している場合、ジョブはそのユーザーのcrontabに予約されているため、そのユーザーの権限で実行されます。
ただし、ジョブが非対話型シェルで実行されることを考慮する必要があります。つまり、$ PATHはコマンドラインからスクリプトを実行するときとは異なる場合があります。
特に at/cron などで予約する場合は、スクリプトで常にフルパスを使用することをお勧めします。
また、現在表示されている問題を回避するには、すべてのファイルへのフルパスを使用することをお勧めします。
競合状態やその他のセキュリティ上の問題を回避するには、mktemp
読み取ったファイルがスクリプトの外部によって変更されないようにする必要があります。
そのため、スクリプトを次のように変更します。
vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
mail_msg=`/bin/mktemp`
/bin/sed "s/IPADDR/$vIP_ADDR/g" /home/xxxx/Documents/Scripts/template.txt > $mailmsg
/path/to/ssmtp [email protected] < $mailmsg
/bin/rm $mailmsg
答え4
一部の人はそれを暗示したりリンクをかけたりしていますが、私のディストリビューションのmanドキュメントには見つからないので、調べる最善の方法はそれをcronに追加することです。
* * * * * echo "$PWD" > /tmp/lolcronjobs
次に、locronjobsを削除して作業ディレクトリが何であるかを確認します。 $ PATHやその他の環境変数を探している場合も同様です。