質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.23%

cronの設定についてどなたか教えていただけませんか

受付中

回答 6

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 5,781

dlrowolleh

score 120

何卒よろしくお願いいたします。

前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+3

スクリプトは実行可能になっているでしょうか?

cron の実行部分に /bin/bash /home/hoge/Desktop/hoge/sample/sample.sh と書いてみるか、スクリプトの先頭行に #!/bin/bash と書いて実行フラグを追加する (chmod +x sample.sh) かを試してみてください。

解決しない場合は、もっと単純な例 (touch /home/hoge/foo.txt など) を試してみて、cron 自体が動いているかの確認をしてみると良いかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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

    ファイルが作成されない理由として考えられるのは、cron の実行時のユーザにそのディレクトリに対する書き込み権限がない、などでしょうか。ただ、crontab -e でやっているので、hoge ユーザに書き込み権限があれば問題ないはずです。他の理由についてはちょっとパットは思い当たりません…。

    エラーについては、他の方もおっしゃっている通りスクリプトの中身に問題がある可能性が高そうです。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に登録するとエラーが返ってきます。
    原因は何が考えられるでしょうか?
    何卒よろしくお願いいたします。

    キャンセル

+2

エラーが発生していれば、crontab -e を実行したユーザー宛にメールが来ているはずですので、確認してください。
「手動で実行すればうまく行くのに、cronに登録するとエラーになる」の原因は、カレントディレクトリの違いか、環境変数の違いです。
手動で実行してもうまく行かないのであれば、それ以前の問題ですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/08 15:40

    あなたが、「これが動かしているスクリプトファイルだ」と思っているものと、「実際に動いているスクリプトファイル」が異なると言うことだと思います。
    コマンドラインで、
    cd /home/hoge/Desktop/hoge/sample
    cat sample.sh
    と打つと、どう表示されますか?

    キャンセル

  • 2016/07/11 17:38

    返信いただきありがとうございます。
    >あなたが、「これが動かしているスクリプトファイルだ」と思っているものと、「実際に動いているスクリプトファイル」が異なると言うことだと思います。

    端末で文字化けが発生していました。
    これも
    「これが動かしているスクリプトファイルだ」と思っているものと、「実際に動いているスクリプトファイル」が異なると言うこと
    になると思ったのですが、
    合っていますか?
    また、文字化けの対策方法を教えていただけないでしょうか?

    何卒よろしくお願いします。

    キャンセル

  • 2016/07/12 23:44

    上記コメントでお書きの状況が不明です。「なにをしたらどうなった」と書いてください。「こうならなかった」とか「うまくいかない」などの書き方ではさっぱり状況がつかめません。

    それはさておき、
    コマンドラインで、
    cd /home/hoge/Desktop/hoge/sample
    cat sample.sh
    と打つと、どう表示されますか?

    キャンセル

+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  629 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ファイルのグループがおかしいためにこの設定ファイルが無視されています。

これはこれで、別途、調査する必要があると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/08 13:49

    返信していただきありがとうございます。
    >あと、お手数ですが、本日 追記いただいた追加情報は質問欄にも転記していただけますか?

    >各回答者のコメント欄に情報が分散しているため、非常に読みづらい状況になっておりますので。

    申し訳ありませんでした。
    大変失礼致しました。
    問題の解決ばかりに気を取られてしまい、皆様に読みやすくすることを忘れておりました。
    追記・補足いたしましたので、何卒よろしくお願いいたします。

    キャンセル

  • 2016/07/08 15:26

    情報を取りまとめていただき、ありがとうございます。

    私の回答欄の
    「2016/07/06 追記」
    という項に 追記いただいた情報から考えられる原因と対策を記載させていただいております。
    お時間のあるときに、ご確認ください。

    キャンセル

  • 2016/07/11 15:17

    丁寧に解説していただきありがとうございます

    bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
    でした。
    * * * * * cd /home/hoge/Desktop/サンプル/sample; /bin/bash ./sample.sh
    の結果ですが、
    /bin/sh: 1: Syntax error: word unexpected (expecting ")")
    でした。
    mailの
    Subjectが
    Cron <hoge@pc> cd /home/hoge/Desktop/文字化け/sample; /bin/bash ./sample.sh
    となっています。
    >と出力されていることから、/etc/crontabファイルのグループがおかしいためにこの設定ファイルが無視されています。

    >これはこれで、別途、調査する必要があると思います。
    といただきました。
    これはcron -eに登録していても、グループがおかしいから登録した内容は実行できないという意味で解釈しましたがあっていますか?
    どのように対処すればよいでしょうか?
    何卒よろしくお願いします。

    キャンセル

+2

cron実行してエラーメッセージなどがあればメールに送られます。
ターミナルで実行してる時はターミナルに表示されますが
cronの時は表示先がないのでそうなってます。

新着メールがあります的なメッセージがターミナルに
出てたりしませんか? メールの読み方は…
http://www.uetyi.com/server-const/command/entry-166.html

thincaさんがコメントで書かれているようにリダイレクトされて
いれば(そしてもしエラーメッセージが出ていれば)
メールは出されずにリダイレクト先のファイルに出力されます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/04 18:43

    もし以下のコマンド(手入力)がエラーになるなら
    /bin/sh ./sample.sh

    スクリプトの1行目がなんかおかしいかもです。

    キャンセル

  • 2016/07/06 14:10

    返信いただきありがとうございます。
    早速試してみました。
    sample.shのあるディレクトリ

    /home/hoge/Desktop/hoge/sample

    /bin/sh ./sample.sh
    と実行してみました。
    sample.sh
    は実行でき、
    実行した年月日時.htmlファイルが
    /home/hoge/Desktop/html/1_吉田
    に作成されていました。
    sample.sh
    の内容は
    1 #!/bin/bash
    2 set -x
    3 wget -nd -O /home/hoge/Desktop/html/1_吉田/$(date '+%Y_%m_%d_%H:').html http://※※.com
    です。
    手入力で実行できて、cronに登録して実行できない原因は何が考えられるでしょうか?
    何卒よろしくお願いします。

    キャンセル

  • 2016/07/06 17:47

    moonphaseさんのセンが当たってる気がしてきました。
    env コマンドを実行して LANG に何が設定してあるか確認します。
    sample.sh の2行目あたりに
    export LANG=上記で調べた設定内容
    を追記するといけるかも?

    キャンセル

+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 でないといけないような気がします。

単体実行したのと出来る限り同じ環境で動かすようにしましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/08 14:29

    返信いただきありがとうございます。
    >cronはLANG環境変数が設定されていないはずなので、スクリプト内で日本語を利用する場合はwgetする前に
    >export LANG=ja_JP.UTF-8
    >を記載する

    ということで、皆さんが環境変数とおっしゃっていた意味がなんとなく分かった気がします。
    大変ご迷惑をお掛けしました。


    * * * * * export LANG=ja_JP.UTF-8; cd /home/hoge/Desktop/サンプル/sample; ./sample.sh
    とcronに登録しましたが、
    やはりメールが届きます。
    内容は以前と変わらず、
    /bin/sh: 1: Syntax error: word unexpected (expecting ")")
    でした。

    今まで
    /home/hoge/Desktop/hoge/sample/sample.sh
    と質問していましたが、
    /home/hoge/Desktop/hoge/サンプル/sample.sh
    の間違いでした。

    現在は
    * * * * * export LANG=ja_JP.UTF-8; cd /home/hoge/Desktop/サンプル/sample; ./sample.sh
    と登録してあります。
    この場合にも環境変数が問題になっているということでしょうか?

    cd /home/hoge/Desktop/サンプル/sample; ./sample.sh
    と入力した場合はきちんと動作。実行します。

    また、分散していて大変読みづらくなってしまっていたため質問に
    追記・補足をさせていただきました。大変申し訳ありませんでした。
    何卒よろしくお願いいたします。

    キャンセル

  • 2016/07/11 18:14

    出ているエラーは日本語のパス部分が適切に処理されていない気がします。
    ターミナルを開いて
    env | grep LANG
    とした結果はどうなっていますか?


    日本語を扱う場合は、LANG環境変数を適切に設定する必要があります。
    crontabのファイル内も日本語を使うことはやめておいたほうが良いです。
    パス内の「サンプル」を英語「Sample」に変更できませんか?

    せめて sample.sh 内で cd /home/hoge/Desktop/サンプル/sample しましょう。


    #日本語を使わないほうがいいというのは、日本語が表示されないコンソールからでも、保守作業に支障をきたさぬ為、、、というだけですので、人により考えは異なるかもしれません

    キャンセル

  • 2016/07/13 15:01

    返信いただきありがとうございます。
    env | grep LANG
    の結果ですが
    LANG=ja_JP.UTF-8
    GDM_LANG=ja
    LANGUAGE=ja_JP.UTF-8
    でした。

    sample.shの内容は
    1 #!/bin/bash -x
    2 set -x
    3 export LANG=ja_JP.UTF-8; wget -nd -O /home/hoge/Desktop/html/1_吉田/$(date '+%Y_%m_%d_%H:').html http://※※.com

    になっています。
    /home/hoge/Desktop/html/1_吉田/
    の吉田を
    yosidaなどに変えて
    /home/hoge/Desktop/html/1_yosida/
    などにしたほうがいいでしょうか?

    キャンセル

+1

crontabに登録されたシェルが、手起動だと正常に動作するにも関わらず、クーロンに登録されたシェルの動作が期待通りで無い場合、実行環境の違いが原因となる場合が多いです。
クーロンでenvやsetコマンドを実行して、ログインの場合と比較してみてはいかがでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る