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


170

コマンドラインから実行すると機能するスクリプトがありますが、スケジュールを設定するとcron、ファイルやコマンドが見つからないというエラーが発生します。私の質問は2つあります。

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

  2. cronジョブが起動されたとき、作業ディレクトリは何ですか?実行するスクリプトを指定するディレクトリですか、それとも別のディレクトリですか?

これが私のcronジョブです。

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 XXXXX@gmail.com < 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、ユーザーとして実行できます。これを適切に機能させるために何が欠けていますか?

回答:


158

cd /home/xxxx/Documents/Scripts/ジョブをそのディレクトリで実行する場合は追加します。cronがその特定のディレクトリに変更される理由はありません。Cronはコマンドをホームディレクトリで実行します。

に関してはssmtp、デフォルトではないかもしれませんPATH。クーロンのデフォルトのパスは実装依存であるので、あなたのmanページをチェックしますが、すべての可能性で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

@Giles -おかげで、でしょうcron、それは自分だ持っているPATHか、私は、ユーザーのを確認することができますかPATH?私はそれが自分だ持つようにセットアップSSMTP設定userし、wheelそれは誰もが(cronを含む)、それを使用できるようにするだろうと考え許可。CENTOS 6.2のImに役立つ場合
ProfessionalAmateur

3
@ProfessionalAmateur問題は、使用ssmtpが許可されていないことではありませんが、cronジョブがにないために呼び出されssmtpた実行可能ファイルを見つけられないことPATHです。「あなたのユーザー」のようなものはありませんPATH。これはプロセスごとの設定であり、ユーザーごとの設定ではありません。PATH=…crontabに行を追加することにより、すべてのcronジョブのパスを設定できます。
ジル

MAILTO='XXXX@gmail.com 'を追加して、PATHのセットアップと連動させる必要がありました。奇妙だが、それは私のために働いた。
MAC

ssmtpの場合、使用できます。´which ssmtp´ ...
フレドリックガウス

@FredrickGaussそれを作るtype ssmtp
ジル

20

cronjobがbashスクリプトの場合、次のスクリプトはスクリプトの場所にCDを転送します(cron定義で絶対パスを使用していると仮定します):

cd "$(dirname "$0")";

14

質問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 XXXXX@gmail.com < $mailmsg
/bin/rm $mailmsg

7

cron各ユーザーのスケジュールされたジョブをそのユーザーとして実行します。これで、ホームディレクトリに関連するスクリプトを実行できるようになります。

別の場所から実行する必要がある場合cdは、スクリプトで単に使用してその場所に移動します。

ssmtpはおそらくcronのデフォルトのPATH にはありません(ほとんどのプラットフォームで設計により非常に狭く設定されています)。ssmtpスクリプトでフルパスを指定するか、a)すべてのスクリプトで使用できるcrontabファイル、またはb)各スクリプトで明示的にPATHを設定できます。


3

cronの環境を簡単に見つける方法については、このスレッドを確認してください。これは、対話型シェルで慣れているものよりはるかに少ないです。何も設定されていないことを想定し、明示的に自分で設定することをお勧めします。


1

cronジョブを実行する際のデフォルトの作業ディレクトリはホームディレクトリで、通常は/home/your-user-nameです。

@Kusalanandaの優れたコメントを採用。


1
いいえ。システムがホームディレクトリを保持する場所によって異なります。/home普遍的とは程遠い。
クサラナナンダ

1
@Kusalananda LSBの標準は言う/home
ペテル

1
@peterhまあ、macOSの使用/Usersと歴史的なUnicesの使用/usr、そしてLinuxでさえ、システムユーザーのホームディレクトリはどこか下にあるかもしれません/var
クサラナナンダ

1
@Kusalanandaそうですね。
ペテル

ありがとう、あなたは実際にこの質問に答えた唯一の人です:)
所有権

0

一部の人々はそれをほのめかすか、リンクしていますが、私のディストリビューションのマニュアルドキュメントで見つけることができないため、見つけるための最良の方法は、これをcronに追加することです

* * * * * echo $PATH > /tmp/lolcronjobs

私の場合、ubuntuはデフォルトで/usr/bin:/binいくつかの問題を引き起こしたものだけを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.