cronの設定についてどなたか教えていただけませんか
- 評価
- クリップ 2
- VIEW 5,781
何卒よろしくお願いいたします。
前提・実現したいこと
Linuxのパソコンを使っています。
自作したshell scriptを毎回決まった時間に自動で動作させたいと思っています。
/home/hoge/Desktop/hoge/sample/内にある、
sample.shを毎週月曜日と金曜日の14時56分に自動的に実行させたいです。
発生している問題・エラーメッセージ
エラーメッセージの見かたも分かっておりません。
時間になって待機していても、実行されていませんでした。
該当のソースコード
56 14 * * 1,5 /home/hoge/Desktop/hoge/sample/sample.sh
と
crontab -e
と入力した際の末尾に追加しています。
試したこと
crontab -e
で
末尾に
56 14 * * 1,5 /home/hoge/Desktop/hoge/sample/sample.sh
と追加しています。
あとは時間が過ぎた時、実行されていたかどうかを確認しました。
きちんと実行できていたら、
/home/hoge/Desktop/hoge/sample/hoge1/
ディレクトリ内に
hoge.txtが作成されているはずだったのですが、
/home/hoge/Desktop/hoge/sample/hoge1/
ディレクトリを見に行っても
空のままでした。
補足情報(言語/FW/ツール等のバージョンなど)
環境はubuntu15.10です。
GNU bash, バージョン 4.3.42(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
追記・補足(回答いただいたことで試したこと)
cd /home/hoge/Desktop/サンプル/sample; ./sample.sh
と手入力で実行した場合は問題なく実行でき動作しました。
crontab -eの内容
* * * * * cd /home/hoge/Deskto/サンプル/sample; ./sample.sh
上記crontab実行時のエラーメールの内容
/bin/sh: 1: Syntax error: word unexpected (expecting ")")
sample.shの内容
1 #!/bin/bash -x
2 set -x
3 wget -nd -O /home/hoge/Desktop/html/1_吉田/$(date '+%Y_%m_%d_%H:').html http://※※.com
* * * * * /home/hoge/Desktop/hoge/sample/sample.shの時のcronの実行ログと思われる/var/log/syslogの内容
Jul 4 15:47:01 hoge cron[629]: (*system*) INSECURE MODE (group/other writable) (/etc/crontab)
Jul 4 15:47:01 hoge cron[629]: (hoge) RELOAD (crontabs/hoge)
重要である部分が分散してしまい、大変読みづらい状況になっておりましたことをお詫びします。
追記(試したこと7/11)
crontab の内容
* * * * * cd /home/h28-sotuken/Desktop/サンプル/sample; ./sample.sh
エラーメッセージのmail
/bin/sh: 1: cd: can't cd to /home/hoge/Desktop/文字化け
手入力
単体で
cd /home/h28-sotuken/Desktop/サンプル/sample; ./sample.sh
と入力た時はsample.sh
は動作します。
sample.shの内容
1 #!/bin/bash -x
2 set -x
3 wget -nd -l1 -r -O /home/hoge/Desktop/サンプル/sample/html/1_吉田/$(date '+%Y_%m_%d_%H:').html http://www.※※.com
文字化けしていたので「サンプル」を「A」にしました。
Before
* * * * * cd /home/h28-sotuken/Desktop/サンプル/sample; ./sample.sh
After
* * * * * cd /home/h28-sotuken/Desktop/A/sample; ./sample.sh
手入力
cd /home/h28-sotuken/Desktop/A/sample; ./sample.sh
と入力た時sample.sh
は動作します。
sample.shの内容
1 #!/bin/bash -x
2 set -x
3 wget -nd -l1 -r -O /home/hoge/Desktop/A/sample/html/1_吉田/$(date '+%Y_%m_%d_%H:').html http://www.※※.com
でした。
文字化けしていたのでディレクトリ名「サンプル」を「A」にしたところうまく行くのですが、ディレクトリ名「サンプル」ではうまくいきません。
ディレクトリ名「サンプル」のままで実行するにはどうしたらいいでしょうか?
何かとよろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+3
スクリプトは実行可能になっているでしょうか?
cron の実行部分に /bin/bash /home/hoge/Desktop/hoge/sample/sample.sh
と書いてみるか、スクリプトの先頭行に #!/bin/bash
と書いて実行フラグを追加する (chmod +x sample.sh
) かを試してみてください。
解決しない場合は、もっと単純な例 (touch /home/hoge/foo.txt
など) を試してみて、cron 自体が動いているかの確認をしてみると良いかもしれません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
エラーが発生していれば、crontab -e を実行したユーザー宛にメールが来ているはずですので、確認してください。
「手動で実行すればうまく行くのに、cronに登録するとエラーになる」の原因は、カレントディレクトリの違いか、環境変数の違いです。
手動で実行してもうまく行かないのであれば、それ以前の問題ですが。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
以下を順に確認してみてください。
cronが起動しているか?
ps aux | grep cron | grep -v grep
と実行して、cronのプロセスが表示されるか確認してください。
(以下はCentOS上での結果です)
root 7388 0.0 0.0 106336 284 ? S 04:02 0:00 crond
root 7389 0.0 0.0 8688 332 ? Ss 04:02 0:00 /bin/bash /usr/bin/run-parts /etc/cron.daily
root 7872 0.0 0.0 8776 208 ? S 04:03 0:00 awk -v progname=/etc/cron.daily/logrotate progname {????? print progname ":\n"????? progname="";???? }???? { print; }
root 21631 0.0 0.0 74808 748 ? Ss Apr15 0:23 crond
ログ
Ubuntuの場合、/var/log/syslog
にcronの実行ログが出力されるようです。
月・金の14時56分に該当のシェルが実行されているか、およびエラーが出力されていないか確認してください。
金曜まで待つのが面倒なら、
56 14 * * 1,5 /home/hoge/Desktop/hoge/sample/sample.sh
を
* * * * * /home/hoge/Desktop/hoge/sample/sample.sh
に変更すれば1分ごとに実行してくれます。
設定ファイルの所有者・権限
cronは、設定したユーザー以外の者が書き込み・実行できる設定ファイルを無視します。
※man cron
の記述
The crontab files have to be regular files or symlinks to regular files, they must not be executable or writable by anyone else than the owner.
該当の設定ファイルの権限・所有者を確認してみてください。
crontab
コマンドで編集した設定は、Ubuntuの場合/var/spool/cron/crontabs
というパスの下に保存されるようです。
"hoge"ユーザーでcrontab
コマンドを実行した場合、恐らく hoge という名前のファイルですので、
ls -al /var/spool/cron/crontabs
と実行し、hoge ファイルの所有者・権限が
-rw------- 1 hoge hoge 29 6月 29 16:44 2016 hoge
のように表示されれば、OKです(重要なのは"-rw-------" 部分と"hoge hoge"部分です)。
ファイルの末尾に改行がついているか?
cronは、設定ファイルの行頭から改行またはコメントの開始文字(%)までを1つの"設定"とみなします。
※man 5 crontab
の記述
The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh
or by the shell specified in the SHELL variable of the cronfile.
そのため、ファイルの末尾に改行がないと、最終行に記述した設定が無視されてしまいます。
crontab -e
で開いたファイルの末尾に1つ、空行を追加して、様子を見てみてください。
2016/07/06 追記
他の回答者様へのコメントに記載したエラーメッセージが
/bin/sh: 1: Syntax error: word unexpected (expecting ")")
となっていることから、cronで/bin/sh
を実行すると、bash
とはべつのシェル(おそらくdash
?)が起動していると思われます。
https://ja.wikipedia.org/wiki/Debian_Almquist_shell
上の予想が正しければ、bash
を使用して sample.sh を起動するよう、cronに指示してやればうまく動くはずです。
まず、以下のコマンドを実行してください。
whereis bash
環境によって異なりますが、以下のようにいくつかのパスが表示されるはずです。
bash: /bin/bash /usr/share/man/man1/bash.1.gz
このうち/bash
で終わるパスが、bash
コマンドの実体となるファイルです。
(上の例の場合、/bin/bash
です)
cronの設定に、"./sample.sh" の前にbash
の実体ファイルをフルパスで追記してください。
例えば、以下のような感じです。
Before
* * * * * cd /home/hoge/Desktop/hoge/sample; ./sample.sh
After
* * * * * cd /home/hoge/Desktop/hoge/sample; /bin/bash ./sample.sh
これで、シェルが正しく実行されるか、あるいはエラーメッセージがどのように変わるか確認してみてください。
ちなみに、当ご質問とは無関係ですが、 /var/log/syslog に
Jul 4 15:47:01 hoge cron[629]: (*system*) INSECURE MODE (group/other writable) (/etc/crontab)
と出力されていることから、/etc/crontab
ファイルのグループがおかしいためにこの設定ファイルが無視されています。
これはこれで、別途、調査する必要があると思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
cron実行してエラーメッセージなどがあればメールに送られます。
ターミナルで実行してる時はターミナルに表示されますが
cronの時は表示先がないのでそうなってます。
新着メールがあります的なメッセージがターミナルに
出てたりしませんか? メールの読み方は…
http://www.uetyi.com/server-const/command/entry-166.html
thincaさんがコメントで書かれているようにリダイレクトされて
いれば(そしてもしエラーメッセージが出ていれば)
メールは出されずにリダイレクト先のファイルに出力されます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
cron -e で次の様になっている箇所を
/home/hoge/Desktop/hoge/sample/sample.sh
次のように変更してみてください。
(cd /home/hoge/Desktop/hoge/sample; ./sample.sh)
恐らく、sample.shの内容が、カレントパスが /home/hoge/Desktop/hoge/sample でないといけないような気がします。
単体実行したのと出来る限り同じ環境で動かすようにしましょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
crontabに登録されたシェルが、手起動だと正常に動作するにも関わらず、クーロンに登録されたシェルの動作が期待通りで無い場合、実行環境の違いが原因となる場合が多いです。
クーロンでenvやsetコマンドを実行して、ログインの場合と比較してみてはいかがでしょうか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/06/29 16:27
はじめまして。
ご回答いただきありがとうございます。
ただ、私はリナックス初心者でまだまだ経験が浅く
分からない部分が多くありますので、
ひとつずつコメントします。
何卒ご教授お願いいたします。
まず、
スクリプトは実行可能になっているでしょうか?
ですが、
スクリプトの先頭に
#!/bin/bash
と書いています。
また、chmod +x sample.sh
も実行していて、
./sample.sh
と実行した際には
./sample.sh
の動作ができています。
そして、
解決しない場合は、もっと単純な例 (touch /home/hoge/foo.txt など) を試してみて、cron 自体が動いているかの確認をしてみると良いかもしれません。
とのアドバイスも
試してみました。
foo.txtを
/home/hoge/
に作り
cron -e
と入力して
行の最後に
50 14 * * * /home/hoge/foo.txt
と入力して14時50分を過ぎてから
ls -l /home/hoge/foo.txt
と入力したところ、
foo.txtの時間は14:50になっていました。
そして、
50 14 * * * /home/hoge/foo.txt
を
55 14 * * * /home/hoge/foo.txt
に変更して、
14時55分を過ぎてから
ls -l /home/hoge/foo.txt
と入力したところ、
foo.txtの時間は14:55になっていました。
これは
cronが動作しているということでいいでしょうか?
05 15 * * * /home/hoge/Desktop/hoge/sample/sample.sh
と登録しているのですが、
やはりうまくいきません。
cron の実行部分に /bin/bash /home/hoge/Desktop/hoge/sample/sample.sh と書いてみるかとのアドバイスを頂いておりますが、
05 15 * * * /home/hoge/Desktop/hoge/sample/sample.sh
を
05 15 * * * /bin/bash /home/hoge/Desktop/hoge/sample/sample.sh
にするということで合っていますか?
実行部分というのが未だによく分かっていなかったため、
これはまだ実行しておりません。
実行部分というのは
05 15 * * *
以降の部分ということでしょうか?
長文大変失礼しました。
何卒よろしくお願いします。
2016/06/29 17:02
> にするということで合っていますか?
あっています。が、実行フラグがついているのであれば恐らくここは問題ではなさそうです。
otn さんの言うように、実行環境の違いでうまく動いていないのかもしれません。
ややこしい手順は置いておいてとりあえずエラーを知りたいのであれば、
05 15 * * * /bin/bash /home/hoge/Desktop/hoge/sample/sample.sh > /home/hoge/error.txt 2>&1
とする方法もあります。コマンドの出力がファイルに保存されるので、何かエラーメッセージが出ていれば確認できるかと思います。
2016/07/04 13:55
早速
crontab -e
で
* * * * * /bin/bash /home/hoge/Desktop/hoge/sample/sample.sh > /home/hoge/error.txt 2>&1
としてみましたが、
/home/hoge/
を見に行ってもerror.txtは
作成されていませんでした。
また、
takasima20様に返事をさせていただきましたように
mailコマンドが入っていなかったため、
mailコマンドをインストールしたところ、
1分おきにメールが届くようになりました。
メールの内容は
/bin/sh: 1: Syntax error: word unexpected (expecting ")")
でした。
1行めは
#!/bin/bash
になっています。
./saple.shと実行した時はうまく動作したのですが…
また、* * * * * /bin/bash /home/hoge/Desktop/hoge/sample/sample.sh > /home/hoge/error.txt 2>&1
で
error.txt
が作成されない原因は何が考えられるでしょうか?
お手数ですがよろしくお願いいたします。
2016/07/04 15:22
エラーについては、他の方もおっしゃっている通りスクリプトの中身に問題がある可能性が高そうです。otn さんのアドバイスしている通り、set -x を試してみると良さそうです。
2016/07/06 14:45
現在、cronには
* * * * * cd /home/hoge/Desktop/hoge/sample; ./sample.shと登録しています。
スクリプトも変更し
1 #!/bin/bash -x
2 set -x
3 wget -nd -O /home/hoge/Desktop/html/1_吉田/$(date '+%Y_%m_%d_%H:').html http://※※.com
となっていますが
1分おきにmailが届き
/bin/sh: 1: Syntax error: word unexpected (expecting ")")
と書いてあります。
手動での実行はでき、きちんと動作するのですが、cronに登録するとエラーが返ってきます。
原因は何が考えられるでしょうか?
何卒よろしくお願いいたします。