非常にシンプルなシェルスクリプトを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 *
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`するか、ファイルへの絶対パスを指定しない限り、ホームディレクトリからの相対パスとして扱われます。