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

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

ただいまの
回答率

90.51%

  • Linux

    3777questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • C

    3687questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3450questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Ubuntu

    1404questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

  • cron

    167questions

    cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

初心者です。crontabがどうしても機能しなくて困っています。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 910
退会済みユーザー

退会済みユーザー

初心者です。crontabがどうしても機能しなくて困っています。

一時的にUbuntu 16.04 LTSを使っていますが、普段はWindowsを使っていますので、いろいろネットで調べましたが、解決できなくてお手上げ状態です。

一応自分でやったことを書きます。なんとなくですが、何か根本的なことであったり、非常に初歩的なケアレスミスをしている気がします。

よろしくお願いします。

・crontab -eからnanoというエディターみたいなソフトを使って、「* * * * * touch /test /result.txt 2>&1」というコマンドを設定しています。このコマンドはcronが動くかどうか試すために設定しているだけで、実際cronを使ってやりたいことは別のことです。touch他のコマンドもいくつか試してみましたが、cronは機能しませんでした。そのときは.shというファイルを実行するコマンドだったので、chmodで実行権限を与えましたが、それでも機能しませんでした。

'・touchでtestファイルが作られないだけではなく、result.txtは一切出力されません。

・GUIのシステムモニターを起動しても、「crond」「cron」という文字列を含むプロセスはありません。

・「crontab -l」と打つと、このような途中から切れた文字列が出てきます。
~$  /result.txt 2>&1bin:/bin:/usr/sbin:/usr/binn(8)

・「crontab -e」と打つと、「/tmp/crontab.x0x0x0/crontab」というファイルを編集しているようです。(xは英字で0は数字です。)

・「crontab -e」と打つと、中身はこのようになっています。コメントアウト以外の部分を自分で設定しました。最初の4行はあってもなくてもcrontabは機能しません。
'# Edit this file to introduce tasks to be run by cron.
'#
'# Each task to run has to be defined through a single line
'# indicating with different fields when the task will be run
'# and what command to run for the task
'#
'# To define the time you can provide concrete values for
'# minute (m), hour (h), day of month (dom), month (mon),
'# and day of week (dow) or use '*' in these fields (for 'any').'#
'# Notice that tasks will be started based on the cron's system
'# daemon's notion of time and timezones.
'#
'# Output of the crontab jobs (including errors) is sent through
'# email to the user the crontab file belongs to (unless redirected).
'#
'# For example, you can run a backup of all your user accounts
'# at 5 a.m every week with:
'# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
'#
'# For more information see the manual pages of crontab(5) and cron(8)
'#
'# m h  dom mon dow   command

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/

  • * * * * touch /test /result.txt 2>&1

'・sudo service cron statusとターミナルに打つと、このような文字列が出てきます。(これはネットに公開するのはまずいでしょうか?)

● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since 土 2017-01-28 16:44:43 JST; 23h ago
Docs: man:cron(8)
Main PID: 650 (cron)
Tasks: 1 (limit: 512)
CGroup: /system.slice/cron.service
└─650 /usr/sbin/cron -f

1月 29 12:17:01 username CRON[12786]: pam_unix(cron:session): session opened for user root by (uid=0)
1月 29 12:17:01 username CRON[12787]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
1月 29 13:17:01 username CRON[14515]: pam_unix(cron:session): session opened for user root by (uid=0)
1月 29 13:17:01 username CRON[14516]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
1月 29 13:17:01 username CRON[14515]: pam_unix(cron:session): session closed for user root
1月 29 14:17:01 username CRON[15658]: pam_unix(cron:session): session opened for user root by (uid=0)
1月 29 14:17:01 username CRON[15659]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
1月 29 14:17:01 username CRON[15658]: pam_unix(cron:session): session closed for user root
1月 29 15:17:01 username CRON[17319]: pam_unix(cron:session): session opened for user root by (uid=0)
'1月 29 15:17:01 username CRON[17320]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+1

cronは動いていると思われます。

/etc/cron.allow /etc/cron.deny が存在するか、存在する場合には中に何か書いてあるか、確認してください。どちらも存在しない場合は、sudo touch /etc/cron.deny とdenyの方の空ファイルを作って下さい。

・「crontab -l」と打つと、このような途中から切れた文字列が出てきます。 

ということから、ファイルが壊れている可能性もあります。あるいはファイルが壊れていなくて、端末の設定がおかしいだけかもしれません。
crontab -l | wcで、どう出力されますか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/29 20:47

    どうもありがとうございます。

    ターミナルからは、touchできますので、テキストファイルが生成されます。
    touch /media/username/USB/test

    「crontab -l | wc」は、このように返ってきます。
    0 256 1495

    >端末の設定がおかしいだけかもしれません。
    なんとなくですが、これはありえそうな気がします。

    「/etc/cron.allow」「/etc/cron.deny」は、いずれも存在しませんでしたので、「sudo touch /etc/cron.deny」で作成しました。しかし、cronは実行されません。

    よろしくお願いします。

    キャンセル

  • 2017/01/29 21:38

    > 0 256 1495
    壊れてますね。最初の数字は行数(改行文字の数)です。
    改行文字がおかしい。

    crontab -l | file -
    で、 with CR line terminators と表示されたら、改行文字がおかしかったということなので、
    crontab -l | tr '\r' '\n' > workfile
    crontab workfile
    で、復元できます。

    file - の結果に with CR line terminators がなければ、その結果をそのまま書いてください。

    キャンセル

  • 2017/01/30 19:03

    おかげさまで、touchは動くようになりました。どうもありがとうございます。

    最初に「crontab -l | file -」と打ったときは、このように返ってきました。
    /dev/stdin: UTF-8 Unicode text, with CR line terminators

    教えていただいたように修正してから、「crontab -l | file -」と打ったときは、このように返ってきます。
    /dev/stdin: UTF-8 Unicode text

    ・このように返ってきていれば、正常だと言えるでしょうか?

    ・実際は、コマンドが一つではないので、.shのファイルを起動しています。
    * * * * * /media/username/device/test.sh

    メールを送らないようにしたので、.shのファイルには、MAILTO=""を書いていますが、これらを書くと、エラーメッセージがポップアップウィンドウにでてきて、cronからプログラムは起動されません。メールを送らないようにするにはどうしたらよいでしょうか?またどうしてもこれらを書かなくてはいけない場合にはどすればよいでしょうか?
    SHELL=/bin/s
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=""
    HOME=/

    ・ファイルを置いとく場所は、どこでもよいと思いますが、安全でエラーが起きにくい場所や、cronのときによく使われる場所や、ここに置くとわかりやすいという場所はあるでしょうか?たとえば、/tmpはどうでしょうか?

    ・nanoというコマンドライン専用のエディタを扱うだけでも苦労しましたので、そのときに間違えて変な設定をしてしまた可能性はあると思います。今回の原因は何だったのでしょうか?

    ・初級中級レベルでは、今回の問題を自力で解決するのは、無理でしょうか?

    よろしくお願いします。

    キャンセル

  • 2017/01/30 22:36

    > ・このように返ってきていれば、正常だと言えるでしょうか?
    改行文字については正常です。改行文字以外の原因でおかしいことはあり得ます。

    > メールを送らないようにするにはどうしたらよいでしょうか?
    標準出力・標準エラー出力に何も出力せず、コマンド全体がRC=0で終わればメールは送られません。
    test.shの先頭で、exec >/tmp/logfile 2>&1 とリダイレクトを書き、最後にexit 0と書けば良いです。

    > ファイルを置いとく場所は、どこでもよいと思いますが、
    コマンドファイルだと、ホームディレクトリの下、普通は$HOME/bin とかですね。
    一時ファイルだと、他とファイル名がぶつからないように注意して、/tmpか、/var/tmp でしょうか。
    あるいは、$HOMEの下でも良いと思います。

    > 今回の原因は何だったのでしょうか?
    nanoの操作ミスだと思いますが、使ったこと無いので分かりません。

    > ・初級中級レベルでは、今回の問題を自力で解決するのは、無理でしょうか?
    ファイルの文字コードや改行コードがおかしいと気づかないのは、中級とは言えないと思います。
    初級者でも、
    > ・「crontab -l」と打つと、このような途中から切れた文字列が出てきます。
    の時点で何かcrontabファイルの中がおかしいと気づいて欲しいところです。解決方法は自力でなくても良いけど。

    キャンセル

  • 2017/01/31 14:56

    ありがとうございました。無事解決できました。

    キャンセル

0

crontabを初めて起動するとcrontabのテンプレートにコメントが書いてあり「やりたい仕事を1行に1つ記述しなさい」と書いてあります。ですから、

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/ 
...

このような記述をしてしまうことはcrontabのフォーマットに違反していると思います。お試しでやるなら例えば次のような行のみにするとよいです(元々あるコメントは消さなくていいですよ!)

* * * * * touch $HOME/crontest

またcrontab -eで編集する場合、それを行ったユーザー用のcronタスクを定義することになります。もしこれをユーザーu1で設定したとするとユーザーu1の実行権限を持つプロセスで仕事が行われるので

* * * * * touch /file

とするならユーザーu1は/に対する書き込み権限(/fileがないときにファイルを作るために)や/fileに対する書き込み権限が必要です。もし権限がない状態でこういうcrontabを定義してしまうとスケジュールされたタスクが実行されたときエラーとなり、それがu1のメールボックスへ以下のように投函される結果になります。

$ mail
"/var/mail/u1": 1 message 1 new
From: root@xxx.xxx (Cron Daemon)
To: u1@xxx.xxx
Subject: Cron <u1@xxxx> touch /file
...
Date: Sun, 29 Jan 2017 17:30:01 +0900 (JST)

touch: '/file' に touch できません: 許可がありません

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/29 19:28

    $HOMEって書くのは古くさいでしょうかね・・・(^^;

    キャンセル

  • 2017/01/29 19:32

    どうもありがとうございます。



    書き込み権があると思われる領域にファイルを作ってみましたが、すべてダメでした・・・

    * * * * * touch /home/username/デスクトップ/test /home/username/デスクトップ/result.txt 2>&1
    * * * * * touch /home/username/'デスクトップ'/test /home/username/'デスクトップ'/result.txt 2>&1
    * * * * * touch /media/username/device1/test /media/username/device1/result.txt 2>&1
    * * * * * sudo touch /home/username/デスクトップ/test /home/username/デスクトッ$
    * * * * * sudo touch /home/username/'デスクトップ'/test /home/username/'デスク $
    * * * * * sudo touch /media/username/USB/test /media/username/USB/result.txt 2>$
    * * * * * sudo touch ~/test >~/result.txt 2>&1
    * * * * * touch ~/test >~/result.txt 2>&1
    * * * * * sudo touch ~/test >~/result.txt 2>&1
    * * * * * touch ~/media/username/USB/test >~/media/username/USB/result.txt 2>&1
    * * * * * sudo touch ~/media/username/USB/test >~/media/username/USB/result.txt 2>&1




    「sudo service cron status」と打つ限りでは、cron自体は動いてるような気がするのですが、能力的にメッセージを正確に読み取ることができません。

    なんとなくですが、何か根本的なことであったり、非常に初歩的なケアレスミスをしている気がします・・・

    正直お手上げ状態なので、どうか解決策をいただけないでしょうか?

    ● cron.service - Regular background program processing daemon
    Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
    Active: active (running) since 土 2017-01-28 16:44:43 JST; 1 day 2h ago
    Docs: man:cron(8)
    Main PID: 650 (cron)
    Tasks: 1 (limit: 512)
    CGroup: /system.slice/cron.service
    └─650 /usr/sbin/cron -f

    1月 29 16:17:01 username CRON[18321]: pam_unix(cron:session): session opened for user root by (uid=0)
    1月 29 16:17:01 username CRON[18322]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
    1月 29 16:29:01 username cron[650]: (username) RELOAD (crontabs/username)
    1月 29 18:17:01 username CRON[21752]: pam_unix(cron:session): session opened for user root by (uid=0)
    1月 29 18:17:01 username CRON[21753]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
    1月 29 18:17:01 username CRON[21752]: pam_unix(cron:session): session closed for user root
    1月 29 18:51:01 username cron[650]: (username) RELOAD (crontabs/username)
    1月 29 18:56:01 username cron[650]: (username) RELOAD (crontabs/username)
    1月 29 18:59:01 username cron[650]: (username) RELOAD (crontabs/username)
    1月 29 19:05:01 username cron[650]: (username) RELOAD (crontabs/username)

    キャンセル

  • 2017/01/29 20:04 編集

    自分がやった手順はsudoを一切使わず(自分が普段使うuserで)
    $ cd
    $ crontab -e
    * * * * * touch $HOME/crontest <==この行だけ追加

    この設定では1分ごとに実行される。よってしばしまって1分以上経過したら以下で日付が変わっている(touchされている)ことを確認する。

    $ ls -l crontest

    それ以外は何もしてないです。crontabl -eで設定を変えるとcronが自動的にそれを検出してくれて動いてくれてます。

    なおcronで動かそうとするコマンドがあらかじめ実行できることを確認しておいてからcrontab -eしたほうがいいかも知れません。

    $ cd
    $ touch crontest
    これがうまくいけばcrontab -e で

    * * * * * touch ~/crontest
    あるいは
    * * * * * touch $HOME/crontest

    と書けば成功するはずですから。

    キャンセル

  • 2017/01/29 20:47

    どうもありがとうございます。

    ターミナルからは、touchできますので、テキストファイルが生成されます。
    touch /media/username/USB/test

    キャンセル

0

クーロンテストなら下記の様に書いても良いかと。

  • * * * * touch ~/test >~/result.txt 2>&1

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Linux

    3777questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • C

    3687questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3450questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Ubuntu

    1404questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

  • cron

    167questions

    cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。