シンプルなシェルスクリプトをcronjobとして実行する

非常にシンプルなシェルスクリプトを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変数にあるのかもしれませんが、今のところ私の理解力は非常に限られているので、それが何なのかわかりません。そこで質問なのですが、どうすればスクリプトをcronjobとして実行させることができるのでしょうか?

EDIT:このファイルはすべてのユーザーにrwxのパーミッションが与えられています。これはテストのためです。

EDIT: * * * * touch /home/myUser/scripts/test.txt のようなcronjobは動作しますが、スクリプトは実行されません。

最も簡単な方法は、GUIを使うことです。

Gnomeでは、gnome-schedule (universe)を使用します。

sudo apt-get install gnome-schedule 

KDEでは kde-config-cron を使ってください。

It should be pre installed on Kubuntu

しかし、ヘッドレスのlinuxを使っている場合や、GUIがいらない場合は、次のようにします。

crontab -e

Terminalに入力するとテーブルが表示されます。
これでcronjobを入れなければなりません。
ジョブをこのようにフォーマットします。

*     *     *     *     *  YOURCOMMAND
-     -     -     -     -
|     |     |     |     |
|     |     |     |     +----- Day in Week (0 to 7) (Sunday is 0 and 7)
|     |     |     +------- Month (1 to 12)
|     |     +--------- Day in Month (1 to 31)
|     +----------- Hour (0 to 23)
+------------- Minute (0 to 59)

短絡的なものもあります(*がいらない場合)。

@reboot --> only once at startup
@daily ---> once a day
@midnight --> once a day at midnight
@hourly --> once a hour
@weekly --> once a week
@monthly --> once a month
@annually --> once a year
@yearly --> once a year

短絡的なものをcronとして使いたい場合(動作しないとかで)。

@daily --> 0 0 * * *
@midnight --> 0 0 * * *
@hourly --> 0 * * * *
@weekly --> 0 0 * * 0
@monthly --> 0 0 1 * *
@annually --> 0 0 1 1 *
@yearly --> 0 0 1 1 *
解説 (3)
ソリューション

file.txtはどのディレクトリにありますか? cronはホームディレクトリでジョブを実行しますので、スクリプトが他の場所で cd されない限り、そこでfile.txtを探して作成することになります。

EDIT: シェルでフルパスを指定せずにファイルを参照する場合(フルパス /home/myUser/scripts/file.txt ではなく file.txt など)は、現在の作業ディレクトリにあるファイルを参照しているとみなされます。スクリプトを実行した場合(対話式であれ、crontabであれ)、スクリプトの作業ディレクトリはスクリプト自体の場所とは全く関係なく、スクリプトを実行したものから継承されます。

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

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

解説 (6)

cronでもちゃんと動くはずです。以下の点をご確認ください。

1- cronを設定するための適切なファイルを編集している。

2- スクリプトに適切なパーミッション(実行権限)を与えているか、つまりスクリプトが実行可能かどうか。

解説 (0)