cronがジョブを実行するときの「作業ディレクトリ」とは何ですか?

cronがジョブを実行するときの「作業ディレクトリ」とは何ですか?

コマンドラインから実行するときに動作するスクリプトがありますが、それを使用してスケジュールすると、ファイルまたはcronコマンドが見つからないというエラーが発生します。私の質問は2つあります。

  1. cronジョブのスケジュールに使用するときは、crontab -e権限の基礎として私のユーザーIDを使用しますか?それとも、ある種のcronユーザーIDと関連する権限を使用しますか?

  2. クローンジョブの開始時に作業ディレクトリは何ですか?実行するスクリプトを指定するディレクトリですか、それとも別のディレクトリですか?

これは私のクローンの仕事です。

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/sbinPATH

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やその他の環境変数を探している場合も同様です。

関連情報