cronの挙動について

このQ&Aのポイント
  • cronの挙動について教えてください。cronでコマンドを実行する場合、.bashrcは明示的に実行しなければいけないのでしょうか。
  • cron経由でコマンドが実行できない状態(/var/log/cronにコマンドを実行した履歴は残っています)でした。
  • スクリプトの先頭で.bashrcをsourceコマンドで実行するようにしたところ、cronからも起動できるようになりました。
回答を見る
  • ベストアンサー

cronの挙動について

cronの挙動について教えてください。 現在user「AAA」のcronにシェルスクリプトを登録しています。 コンソールから登録してあるスクリプトが正常に起動できることは確認できております。 しかしcron経由でコマンドが実行できない状態(/var/log/cronにコマンドを実行した履歴は残っています)でした。 色々試したところ、スクリプトの先頭で.bashrc(user「AAA」のもの)をsourceコマンドで実行するようにしたところ、cronからも起動できるようになりました。 (.bashrcには、スクリプト実行に必要な環境変数やパスの設定がされています) そこで質問なのですが、 (1) cronでコマンドを実行する場合、.bashrcは明示的に実行しなければいけないのでしょうか。 cronで実行される場合、ログインした状態と同じ環境で実行されるとばかり思っていたため、見落としていたのですが・・・。 以上、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

man bashでbashのマニュアルが見られます。「起動」というセクションを読むと、~/.bashrc を読むのは、「ログインシェルでない対話的シェル」の時だけだとわかります。 cronから実行されるシェルは対話型ではありませんので、~/.bashrcは読み込まれません。 >cronで実行される場合、ログインした状態と同じ環境で実行されるとばかり思っていたため ログインシェルは、~/.bashrc でないいろいろなファイルを読みます。詳しくは、man bash の「起動」のセクションを参照。 >cronでコマンドを実行する場合、.bashrcは明示的に実行しなければいけないのでしょうか。 .bashrcには対話シェルで必要な設定をいろいろ書くので、cronから起動されるスクリプトでは、普通は source ~/.bashrc はせず、必要な環境変数の設定を個別に書きます。あるいは、PATHの設定程度なら、crontabファイル自体に書きます(man 5 crontab 参照)。 多数のcron起動スクリプトで全く同じ環境変数設定が必要であるような状況では、別途、~/.setenv 等のファイルを書いて、それをsourceするようにします。 .bashrcには端末入出力を伴なうコマンドを書くこともあり、非対話シェルから実行するのはトラブルの元です。

YotaroApple
質問者

お礼

とても分かりやすい回答ありがとうございます。 確かに、.bashrcには、cronで実行するものに不必要なものも沢山宣言されています。 (というより必要なものはごくわずかです) また、容易にユーザが変更可能な.bashrcをcronで読み込むのは確かにトラブルの元になると思います。 .bashrcに定義されている、パス、環境変数のうち必要なものだけをスクリプトで定義するようにしようと思います。

関連するQ&A

  • cronジョブ

    cronの実行時間は、/var/spool/corn/ユーザ のファイルで 時間が記述されているので、実行される時間はわかるのですが、 cronで、ある1つのシェルスクリプトが起動した時間から終了までかかった時間を知りたいのです。 (timeコマンド、メール送信による判断は無しでお願いします。) linuxのどこかのログファイルに、cronのシェル1つ1つのジョブの終了時間が記述されている ファイルはないでしょうか?(可能であれば、実行時間もわかるとよいのですが。) ご教授お願いします。

  • cronが実行されない

    環境:Vine Linux 2.6CR 現在、毎朝4時に、自分で作成したシェルをcrontabで登録して実行させているのですが、cronが動いてくれません。 psで、crondの実行は確認できています。 それと、cronの登録方法は、crontab -eで登録し、シェルは、/etc/cron.dailyに格納しています。 パスも登録しているのですが、実行してくれません。 どこがおかしいのでしょうか? アドバイスをお願いいたします。

  • UNIX : cronにて自動実行すると、whoami が実行できない

    Kornシェルスクリプト(仮名:a.ksh)内の処理で、 「 whoami >> file1 」 をcron設定にて自動実行したところ、上記のコマンド部分が実行されておらず、file1(ファイル)にユーザ名が記載されていませんでした。 しかし、a.kshを手動実行しfile1を見ると、ユーザ名が記載されていて、上記のコマンド部分が実行できていることを確認致しました。 なぜcronにて自動実行すると、上記のコマンド部分が実行できないのでしょうか? 皆様、よろしくお願い致します。

  • cronジョブ

    cronで設定したジョブは、 設定した時間に自動で動き出すと思っています。 このときインターネットに対して、あるhtmlページを取得するcronを毎朝11時に設定してたとします。 11時から12時の間にジョブがいつも終了してたとします。 質問: ★11時40分に、11時に動き出したcronジョブをバックグラウンドではなく、 フォアグラウンド(コンソール上に、シェルスクリプトをたたいてメッセージが流れる状態とおなじようにスクリプト結果をコンソールで確認)で表示するためには、 どうしたらいいのでしょうか? ★またフォアグラウンドで表示したジョブを、バックグラウンドに戻すにはどうしたらいいのでしょうか ご教授お願いします。

  • シェルスクリプトをローカルで動作させるには

    cronジョブが使えるレンタルサーバーを使用しており、cronジョブから起動するshスクリプトを作ろうと思っています。 そこでシェルスクリプトを簡単に書こうと思っているのですが、プログラムはphpしかわかりません。勉強するためにはローカルで実行できる環境が必要だと思っています。 ネットでよく調べてみたのですが、シェルスクリプトをローカルで動作させる方法がわかりません。コマンドプロンプトから実行できたりしないんでしょうか?

  • 、cronのユーザは postgresでないとpg_dumpallが実行できません。

    CronでPostgreSQLのデータベースをバックアップするにあたり pg_dumpallコマンドで実行させるのですが、cronのユーザは postgresでないと実行できません。 コマンドユーザーをrootにして、pg_dumpallを実行させたいのですが、何か良い方法はありますか? cronにはpg_dumpall直接書き、またはスクリプトでも構いません。

  • cronとrc.localへの記述内容について

    こんばんは、皆さん。 先頭行が#!/usr/bin/perlから始まる簡単なPerlスクリプトを書き、 実行権を777にし、/etc/rc.localとrootのcronに記述しました。 記述した内容が間違っていないと仮定した場合、動作しますか? 質問の仕方がよくないと思いますが、つまり、cronや/etc/rc.localは シェルスクリプトでないと制御できないのでしょうか? 実際に試してみましたが、シェルならうまくいくのですが、 Perlを起動できていないようです。 すべてフルパスで指定しているのでパスの問題ではないようです。 実行権もフルアクセスにしてみたので関係ないと思います。 どうすればcronや/etc/rc.localでPerlを扱えるのでしょうか? cronや/etc/rc.local、Perlスクリプトのサンプルを例として 挙げていただけると助かります。 一般的にPerlスクリプトは実行できないのでしょうか? もし実行できなければ、その理由も知りたいです。 よろしくお願いします。

  • cronで複数実行される

    いつもお世話になっています。 Solaris2.6ですが、cron実行でバックアップやらログローテートやら行っていたのですが、 先日、以下のことをやってしまい、二重実行されるようになってしまいました。 ・通常、rootでのcron実行 ・間違えて、一般ユーザのcronにrootとまったく同じものを書き込んでしまった。 ・一回検証で実行して気付き、一般ユーザのcronを削除(crontab -r)した。 これで、再度検証したときに問題なく動作していたようだったので(/var/cron/logを確認していないのがまずい・・・)、そのままにしておいたのですが、 その後、常にスクリプトが二回ずつ実行されるようになってしまいました。 何度もcrontabを確認し、しまいにはcronデーモンを再起動したのですが、今度は4つ同時に実行するようになってしまい、 さらに、cronデーモンを起動しなおしたら8つになってしまいました。 きちんと、killしているのですが、どうしてか分からず、どうしようもなくなっています。 再起動以外に何か解決方法はないでしょうか。 よろしくお願いいたします。

  • csh スクリプトの実行者を知りたい

    スクリプト内部で、そのスクリプトを実行しているのが、 ユーザーなのか、cronなのかを判定することは可能でしょうか? 具体的には、hoge.cshというスクリプトがあり、 これはユーザーmogeのcronで週一回実行するよう登録されています。 さらに、このスクリプトは、メンテナンス時などに、 ユーザーmogeがコマンドラインからも実行することがあります。 スクリプト内部で、cronから走った時と、コマンドラインから 走らせた時で異なるlogを吐かせたいのですが、 どのようにしたらよいでしょうか。 宜しくお願いします。

  • Linuxのcronとrc.localでの制御について

    こんばんは、皆さん。 先頭行が#!/usr/bin/perlから始まる簡単なPerlスクリプトを書き、 実行権を777にし、/etc/rc.localとrootのcronに記述しました。 記述した内容が間違っていないと仮定した場合、動作しますか? 質問の仕方がよくないと思いますが、つまり、cronや/etc/rc.localは シェルスクリプトでないと制御できないのでしょうか? 実際に試してみましたが、シェルならうまくいくのですが、 Perlを起動できていないようです。 どうすればcronや/etc/rc.localでPerlを扱えるのでしょうか? よろしくお願いします。