人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

●質問者: taichino
●カテゴリ:コンピュータ
✍キーワード:SH ジョブ ストレス タスク フロー
○ 状態 :終了
└ 回答数 : 7/7件

▽最新の回答へ

1 ● kn1967a
●18ポイント

できない。

◎質問者からの返答

できないですか。。

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

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

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

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


2 ● ramenboy
●17ポイント

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

でいかがでしょうか?

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

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

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

% su - ユーザ名 -c env

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

◎質問者からの返答

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

なるほど!これは!

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

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

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

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

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

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

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


3 ● YasudaS
●17ポイント

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

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

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

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

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

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

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

◎質問者からの返答

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

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

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

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


4 ● standard_one
●17ポイント

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

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

◎質問者からの返答

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

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

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

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

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


5 ● keino
●17ポイント

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


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

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

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

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

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

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

◎質問者からの返答

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

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

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

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


1-5件表示/7件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ