20

cronjob として実行する必要がある非常に単純なシェル スクリプトがありますが、テスト スクリプトを実行することさえできません。スクリプトの例を次に示します。

/home/myUser/scripts/test.sh

#!/bin/bash
touch file.txt

crontab:

* * * * * /home/myUser/scripts/test.sh

スクリプトはターミナルから正常に実行されますが、cronjob として実行することはできません。これまでのところ、crontabでこれらを試しました:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

* * * * * /bin/bash /home/myUser/scripts/test.sh

そして、これはスクリプトファイルで:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/myUser/scripts

私が収集したものから、解決策は PATH 変数にある可能性がありますが、この時点で私の理解が非常に限られているため、それが何であるかを理解できません。私の質問は、スクリプトを cronjobs として実行するにはどうすればよいですか?

編集:ファイルには、すべてのユーザーに対して rwx 権限があります。これは、テスト目的のためだけです。

編集: cronjobs は機能し* * * * * touch /home/myUser/scripts/test.txtますが、スクリプトは実行されません。

4

5 に答える 5

12

file.txt はどのディレクトリにありますか? cron はホーム ディレクトリでジョブを実行するため、スクリプトcdが別の場所にない限り、そこから file.txt を検索/作成します。

EDIT:シェルでフルパスを指定せずにファイルを参照すると(たとえばfile.txt、フルパスではなく/home/myUser/scripts/file.txt)、現在の作業ディレクトリ内のファイルを参照していると見なされます。スクリプトを (インタラクティブに実行する場合でも、crontab 経由で実行する場合でも) 実行する場合、スクリプトの作業ディレクトリは、スクリプト自体の場所とはまったく関係ありません。代わりに、スクリプトを実行したものから継承されます。

したがって、cd(作業ディレクトリを変更して) スクリプトがあるディレクトリに移動してから実行すると、file.txtスクリプトと同じディレクトリにあるファイルが参照されます。cdただし、最初にそこにいないfile.txtと、スクリプトを実行したときにたまたまあったディレクトリにあるファイルが参照されます。たとえば、ホーム ディレクトリが /home/myUser で、新しいシェルを開いてすぐにスクリプトを実行すると (scripts/test.shまたは/home/myUser/scripts/test.sh;./test.shは機能しません)、ファイル /home/myUser/file.txt にアクセスします。 home/myUser は、現在の作業ディレクトリ (つまり、スクリプトのディレクトリ) です。

からスクリプトを実行すると、cron基本的に同じことが行われます。作業ディレクトリをホーム ディレクトリに設定して実行されます。したがって、スクリプト内のすべてのファイル参照は、スクリプトがcd別の場所にあるか、ファイルへの絶対パスを指定していない限り、ホーム ディレクトリに対して相対的に取得されます。

于 2013-11-03T16:47:45.763 に答える
6

試す、

 # cat test.sh
 #!/bin/bash
 /bin/touch file.txt

次のようにcronします。

 * * * * * /bin/sh /home/myUser/scripts/test.sh

これは次の方法で確認できます。

 # tailf /var/log/cron
于 2013-11-03T17:25:28.007 に答える