web-dev-qa-db-ja.com

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変数にあるかもしれませんが、私の理解はこの時点で非常に制限されているため、それが何であるかを理解することはできません。だから私の質問は、どのようにスクリプトをcronジョブとして実行するのですか?

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

編集:* * * * * touch /home/myUser/scripts/test.txtなどのcronジョブは動作しますが、スクリプトは実行されません。

17
tomtomssi

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

編集:フルパスを指定せずにファイルを参照する場合(例: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が現在の作業ディレクトリであるため、ファイル/home/myUser/file.txtにタッチします(したがってスクリプトの)。

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

11
Gordon Davisson

最も簡単な方法は、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

ターミナルに入力すると、テーブルが表示されます。
ここでcronjobsを挿入する必要があります。
ジョブを次のようにフォーマットします。

*     *     *     *     *  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 *
12
sn0w

試して、

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

cronとして:

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

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

 # tailf /var/log/cron
2
Ranjithkumar T

完全なパスを指定し、scriptfileに適切なアクセス許可を付与します。次のスクリプトファイルを実行して、cronを実行しようとしました。

#!/bin/bash
/bin/mkdir /scratch/ofsaaweb/CHEF_FICHOME/ficdb/bin/crondir

そしてcrontabコマンドは

* * * * * /bin/bash /scratch/ofsaaweb/CHEF_FICHOME/ficdb/bin/test.sh

それは私のために働いた。

0

Cronでも適切に動作するはずです。以下を確認してください。

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

2-スクリプトに適切な許可(実行許可)が与えられているため、スクリプトは実行可能です。

0
virus