07 « 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 09

流星のゲーム日誌

ちまちまゲームや日常の事を書いていきます♪

crontabで個人的にハマったこと 

本格的に「業務」と呼べるものに携わり始めた流星です。

さてさて、今日は先日個人的にドハマりしてしまったことについて書こうかなーと。
題名にもある通り、cronについてなんですけどね。

皆さん、最初に躓くのってやはりこの手の設定ファイルじゃないですかね?
あ、私だけですかそうですか。

まぁそれは良いとして。

cronの設定をする際に
・/etc/crontab を直接編集する方法
・crontab -e で編集する方法

の2種類があると思います。

前者はあまり勧められた方法じゃないみたいですけど、私はこちらの方が好きです。
後者は -r ですべて消えちゃうので、バックアップ取るのが面倒で…。

この両者の違いですが、私はユーザ別に作るか否かくらいにしか考えていませんでした。
この思いこみと無知が合わさってドツボにハマってしまうことに。

というわけで、追記から私がハマってしまったこと。
および解決策を備忘録として書いていきます。



勉強の一環として、CentOS 6 のサーバのcron設定をしていたのですが。
先ほども書いたように普段は/etc/crontab を編集して試していました。

cron の内容としては、決まった曜日にとあるサービスの再起動を行い、
それを指定したファイルへと日時とともにリダイレクト出力すること。

なので例えば
5 1 * * 3 root (date; service httpd restart) > /tmp/test.log
のような設定をしていました。

(上記の記述だと毎週水曜、1時5分にApache の再起動を行い、
その結果を日時とともにtest.logファイルへ出力する…と言った内容になります。
実際は出力ファイルにも日時をつけるような設定にして、ローテートまで行っていますが割愛)

しかし毎度ここの編集も疲れるので、テスト時には crontab -e で試すことにしました。

そしたらエラーのメールが返ってくるではありませんか。
読んでみると、どうも service コマンドが認識されていない模様。
(date コマンドは通る)

この時点でもう私の頭は???でいっぱいでした。


そこでシェルスクリプトの記述法に何らかのルールがあるのでは、
と思い調べてみることに。

そしたらありましたよ。

どうやらスクリプト中では
普段意識せずに使用しているコマンドのパスを通してやる必要があるのだとか。

この辺よく分からなかったので、とりあえずフルパスでコマンドを記述することにしました。
(今回だと/sbin/service ~ と記述。which コマンドで各コマンドのパスを調べました)

そうしてみると見事に実行されました!

よかったよかった…と安堵するのも束の間。

「そしたらなぜ/etc/crontab だとコマンドが通ったのだろうか…?」
と当然な疑問が湧いてきます。

そういえば/etc/crontab の方には頭にいろいろ記述があったな…と思いだし、
開いているとパス変数にしっかりと
/bin/ /sbin/
の文字があるじゃないですか。

これでパスが通されているのでコマンド記述のみで実行できていたんですね。

…あれ?
crontab -e にはこういった環境変数の設定されてなかったな…と思い至りました。

crontab -e だとdate コマンドは通るのに、service コマンドは通らないという謎現象に。

どこでこの設定を見ることができるのか…と探し回ってみること長時間。
cron 実行時に送られてくるメールに普通に書いてありましたというオチ。

これを読んでみると、どうもこちらでは /bin/ のパスしか通されていない模様。
なのでdate は通って、service は通らなかったのですね。


というわけでまとめ(ついでに上記にないことも書きます)。

・/etc/crontab を直接編集
記述法:分 時 日 月 曜日 ユーザ名 実行したいコマンド

ファイルの先頭の環境パスで
/bin/ sbin/ が記述されているので、今回だとdate、service ともにコマンドが通る。
(他にもパスは通っていますが、あくまで今回関係あるものだけ記載してます)

・crontab -e で編集
記述法:分 時 日 月 曜日 実行したいコマンド
※ユーザ毎に作成するものなので、ユーザ名の指定なし

ファイルにはとくに記述はないが、
cron 実行時に送信されるメールに設定されている環境変数が記載されている。

/bin/ のみの記載なので、date はそのままで実行されるが、
service はフルパスでないと実行されない。

(この環境変数がどこで設定されているかは知りません、また調べないとなぁ…)


ま、とりあえず両者の環境には違いがありますよー、とだけ忘れないための記事です。

ではでは。

Posted on 2015/08/30 Sun. 18:15 [edit]

category: IT備忘録

TB: 0    CM: 0

30

コメント

Comment
list

コメントの投稿

Secret

Comment
form

トラックバック

トラックバックURL
→http://gameinfo7.blog137.fc2.com/tb.php/465-31ef6a6c
この記事にトラックバックする(FC2ブログユーザー)

Trackback
list