cronについて質問させて下さい。


cronに登録したジョブを手動で実行する事はできないでしょうか。
例えばtask.shをジョブとして登録した場合に、単にユーザとしてtask.shを実行するのではなく、
環境変数等もcronからの実行と同じ条件にして実行したいです。

理由は、ユーザで実行した場合は動作するのに、cronから実行させた場合は動かないという場合に、
タスクを数分後に登録 => 実行まで待機 => 確認というフローを何度も行っているんですが、
これが面倒で無駄に感じます。手動で実行できるとストレス無く設定できて嬉しいと思います。

多少荒い方法でもかまいませんので、よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2009/07/30 23:34:22
  • 終了:2009/08/06 23:35:02

ベストアンサー

id:bushimichi No.7

ぶしみち回答回数12ベストアンサー獲得回数12009/08/06 09:26:45

ポイント17pt

直接的な回答からずれるかもしれませんが、Cronの設定には Webmin を利用して設定しています。

Webminには、Cronを直接実行するコマンドがついているので、設定と実行を一元的に扱えます。

(ただし、細かな環境変数まで完全に一致しているかはわかりません)

http://www.webmin.com/

id:taichino0730

ご回答ありがとうございます!

webminでcronを操作できるのは知りませんでした。

これはもしかしたらビンゴですね!

試し次第コメントさせて頂きます。

2009/08/06 19:29:19

その他の回答(6件)

id:kn1967a No.1

kn1967a回答回数356ベストアンサー獲得回数72009/07/31 00:02:46

ポイント18pt

できない。

id:taichino0730

できないですか。。

個人的には、cron上でジョブが実行される時の

処理フローをそのままシミュレートすればいいので、

どこかで誰かがやってそうだと考えています。

cronに限らず代替のタスクスケジューラ等でもいいのですが。。

2009/07/31 00:10:20
id:ramenboy No.2

ramenboy回答回数16ベストアンサー獲得回数12009/07/31 00:07:05

ポイント17pt

% su - ユーザ名 -c "スクリプトのパス"

でいかがでしょうか?

cron時と通常時の違いは基本的に環境変数だけなので、厳密に違いを知りたい場合はcrontabの中で、

* * * * * /bin/env > /root/env.log

のようなエントリを登録しておき、

% su - ユーザ名 -c env

の結果との違いを確認しておけば良いと思います。

id:taichino0730

ご回答ありがとうございます。

なるほど!これは!

と思い試してみたのですが、まだ結構挙動が異なりますね。

PWDが結構厄介な感じになっています。

su - user -c cmd を実行したとき、

設定ファイルは.zshenv, .zprofile, .zloginが読まれるんですね。(zshの場合)

cronでの実行の場合は.zshenvだけ読まれますので,

できるだけ.zshenvに環境設定を書くとある程度までは環境を揃えられそうです。

もう少し調査してみます。

2009/07/31 11:55:25
id:YasudaS No.3

YasudaS回答回数351ベストアンサー獲得回数52009/07/31 00:22:47

ポイント17pt

環境変数のうち、いくつかはターミナルやシェルが使っている。

これをターミナルやシェルがない前提のcron job実行環境と同じにするのは、ターミナルやシェルが使っている環境変数を殺したり、書き換える必要がある。

結果、書き換えた瞬間にターミナルやシェルがこけるか、ターミナルやシェルが書き戻すため、実行できないことになる。

わたしがやっていた代替策としては、毎分起動に設定しておいて、shell側に「そのパスにある自分自身をrmしたり空ファイルにする」を末尾や終了時処理に入れこんでおくというもの。

debugする場合にはdebugするスクリプトに書き換えておけば、実行完了時に消えて、次回は起動されない(エラーにはなるけどね)。

待ち時間は1分程度なので、そんなに待つ必要がなくなる。

ただし、処理系によっては、実行中の自己ファイル操作が出来ないものがあるので、そういう時には、1分交互に「実行する」「消す」を入れるとかね。

id:taichino0730

ご回答ありがとうございます。

なるほど、自分自身を消すというのは面白いですね。

standard_oneさんに頂いた回答とあわせて、

cronの小さなテスト環境を作っていくというアプローチもありかもと思い始めました。

2009/07/31 12:05:05
id:standard_one No.4

standard_one回答回数252ベストアンサー獲得回数232009/07/31 09:47:31

ポイント17pt

代替スケジューラというか何というか、1分おきに起動される何もしない dmmy.sh を登録しておいて、テストするときに dmmy.sh の中身を task.sh に書き換えれば待ち時間は短縮されますね。

dmmy.sh の先頭に実効可否判断を入れておくとさらに便利でしょうね、/tmp/dmmy.flg っていうファイルがなかったら何もしないで終了とか。

id:taichino0730

ご回答ありがとうございます。

dummy.shをずっと走らせておくのは良いですね。

僕はtask.shを1分置きに走らせて、crontabではtask.sh >>& /tmp/cron.log; date >> /tmp/cron.log

という感じでログがつもって行くようにしていたのですが、色々面倒がありました。

dummy.sh + dummy.flgで結構スムーズな環境が作れそうですね。ありがとうございます。

2009/07/31 12:08:35
id:keino No.5

keino回答回数204ベストアンサー獲得回数112009/07/31 17:22:46

ポイント17pt

すいません、記憶で書いているのであいまいだし、間違いが多いかもしれませんので、参考程度にみてください。


標準入出力がターミナルと関連づけらてるかどうかを、何かの環境変数で調べられたような気がします。whoコマンドなどの実行結果を変数に一度代入することでも識別できるかも。

で、.zshenvの中で標準入出力がttyとかでない場合は、

→.zprofileと.zloginを.zshenvから読込む

あるいは逆に、標準入出力がttyの場合は、

→.zprofileの中で環境変数を書き換えて、端末との関連付けを外してしまう。

みたいな感じで目的を達成できませんか?

id:taichino0730

ご回答ありがとうございます!

ただ申し訳ありません,時間が取れずに、調べれていません。

時間が出来次第、試してみます。

環境変数さえ揃えたら良いはずなので、行けそうな気がします。

2009/08/06 19:23:34
id:uehaj No.6

uehaj回答回数158ベストアンサー獲得回数152009/08/01 19:55:34

ポイント17pt

while true; do

if [ -f /tmp/command.sh ]

then

chmod +x /tmp/command.sh

/tmp/command.sh

rm /tmp/command.sh

fi

sleep 3

done

こういうスクリプトをcronに登録し起動しておき、

実行させたいときは実行させたいコマンドを呼び

出すスクリプトをcommand.shにコピーするとか

ではいかがでしょう。

id:taichino0730

ご回答ありがとうございます。

なるほど、待ち時間をさらに短くしていくアプローチですね。

一度試してみます!cronの小さな環境を作るアプローチが

人気ですね。

2009/08/06 19:27:11
id:bushimichi No.7

ぶしみち回答回数12ベストアンサー獲得回数12009/08/06 09:26:45ここでベストアンサー

ポイント17pt

直接的な回答からずれるかもしれませんが、Cronの設定には Webmin を利用して設定しています。

Webminには、Cronを直接実行するコマンドがついているので、設定と実行を一元的に扱えます。

(ただし、細かな環境変数まで完全に一致しているかはわかりません)

http://www.webmin.com/

id:taichino0730

ご回答ありがとうございます!

webminでcronを操作できるのは知りませんでした。

これはもしかしたらビンゴですね!

試し次第コメントさせて頂きます。

2009/08/06 19:29:19
  • id:keino
    OSは何だろう?
  • id:taichino0730
    失礼致しました。

    使用している環境は以下になります。
    - CentOS4〜5
    - ubuntu 8.04

    linux系のOSなら他でもかまいません。

    よろしくお願いします。

この質問への反応(ブックマークコメント)

トラックバック

  • cronについて今更学んだので覚え書き **cronって何?Linuxデーモンの一種。crontabというファイルに「この時刻になったらこのコマンドを実行します」ってのを一行に一つ書き連ねておくと、そ
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません