どちらかというとごはん派

主に仕事用のメモブログ。

【cron】LinuxでのCron作成(エラー編)

2008年11月27日 16時13分53秒 | linux bash
私がはまってしまった箇所やCronの設定で失敗している人の現象から
分かる範囲で解決させましょう。

だいたいの方(私も)は、Cronの設定を「crontab -l」で確認しても大丈夫そう。
そしてログを見てもリロードしているっぽい。
そしてCronも起動済みだけど起動しない。という現象なので、
それを前提としたケースを上げてみる。
(つまり、Cronが起動してなかったとかパス間違えとかいうアレゲなエラーは知らないよ。ってことです。はい。)

①環境変数は初期化されてしまうようです。
 実行したいシェルの内部で利用している環境変数をprofileに書き込んでおいたのですが
 (Linux起動時に有効になる環境変数のことです。)
 Cron起動時には設定されていませんでした。
 シェルからjavaを呼んでいる方なんかは、「PATH=:/usr/local/jdk」とかprofileに
 付け加えたと思うんですが、それがCron起動では無効になってしまいます。
 シェルをただ叩くだけなら有効なんですが、
 Cron起動では初期化され「/usr/bin:/bin」位しか設定されていませんので、
 crontab -eで「PATH=:/usr/local/jdk」や、その他自分で設定した環境変数を記述しましょう。
 
 Cron起動時にenvコマンドを設定すると環境変数がどうなっているか確認できますので
 試してみてください。
 
②SHELLの指定してますか?
 crontab -eでSHELLを指定しないと大抵/bin/shが呼ばれてしまうので、
 bashやkchを使用している方などは、きちんと設定してください。
 
③コマンドモードになってませんか?
 起動時刻を過ぎてcronのログファイル(/var/log/cron)を確認したら、
 なんだか実行したっぽいけど、、、でも上手くいかない場合。
 
 Nov 26 12:43:01 server crond[7651]: (testuser) CMD (run-parts /usr/test/test.sh)
 上記のようなログだった場合に、「CMD」と書いてある場合、
 「CMD」以下の()をコマンドとして実行してあります。
 
 そのため、run-partsとかいうコマンドはないからエラーになってしまうのです。
 これで「sh /usr/test/test.sh」とすればうまくいきます。
 
 Cronの設定をググると「run-parts」というのがあったりなかったりするのですが、
 「実行する」という意味らしいので、コマンドエラーになってしまうなら、直に「sh」で実行させてしまいましょう。
 メリットデメリットはありません。
 
④Cannot open /test.log : No such file or directory
 メールをみるとこんなエラーが出ていたりするのですが、コレは①のエラーに近いものです。
 環境変数として「LOG_OUT=/usr/test/logs」とかをprofileで設定していた場合、
 やはり無効になってしまっていて、
 シェル内の「printf "ログ出力します。" >> ${LOG_OUT}/test.log」
 なんかで、「${LOG_OUT}/test.log」が「/usr/test/logs/test.log」と展開されたい場合に「/test.log」と展開されてしまっているわけです。
 それで、test.logなんていうディレクトリはありませんよ。と言ってるわけです。
 
 これもcrontab -eで「LOG_OUT=/usr/test/logs」を付け加えてあげてください。
 
以上です。
ここら辺を再度確認して実行されたら上手くいくのではないでしょうか?
環境変数の初期化なんて知らなかったので、知っていればもっときれいにシェルが組めたのに。。。
と思いますので、きちんと仕組みを理解しましょう。

【cron】LinuxでのCron作成(作成編)

2008年11月27日 15時28分18秒 | linux bash
LinuxでのCronの作成を行います。
私がはまってしまった箇所や意外とCronの設定で失敗している人が多いようなので
(多い割りにエラー解決の資料が少なくて困りました。)
そこら辺の解決になるようなことはエラー編に書いておきます。
エラーやはまってしまった方は「LinuxでのCron作成(エラー編)」を見てください。
こちらでは、作成部分を書いておきます。

◇前提条件◇
 実行したいシェル・・・/usr/test/test.sh
 シェルの実行ユーザ・・testuser

①まず、rootユーザになること。
 su

②rootユーザで、testuserのcronを作成する。
 ◇理由◇
  rootユーザで、rootのcronにtestuserで実行するように設定しても
  上手くいかないことがある。

  testuserで作成するときには、cronの作成権限を渡してあげる必要があるので、
  ちょっとめんどい。

 まずは、viでcron編集をするように以下のコマンドを投げる
 EDITOR=vi; export EDITOR
 デフォルトのエディターをviにするよ。ってこと。
 意外と重要です。これをしないと変なエディターが起動して、何も出来ません。
 
 それでは、以下のコマンドで、実際に作成する。
 crontab -u testuser -e
 (-uはrootでどのユーザのcronを作成するかを宣言し、-eは作成モードっていうこと。ちなみに-lは確認モード。)

③viで書き込む
 viで開いたら、「i」を押下して「挿入モード」にする。
 挿入モードになったら、以下をコピペする。
 -------------------------------------------------------------------------------------------------
 SHELL=/bin/bash
 PATH=/home/testuser/bin
 MAILTO=testuser
 HOME=/
 
 # run-parts
 0 16 * * * /usr/test/test.sh
 -------------------------------------------------------------------------------------------------
 
 コピペしたら「ESCキー」を押下して「ZZ」(保存して終了)を押下して終了します。

④確認してみましょう
 /var/spool/cron配下にtestuserというファイルが出来るので
 catして、上記と同様である旨を確認する。
 パーミッションは500

 cronのログファイル(/var/log/cron)をcatしてみて
 Nov 26 15:21:01 server crond[6417]: (testuser) RELOAD (cron/testuser)
 こんなようなのがでてればOKです。Cronさんが設定ファイルをリロードしてくれました。

 でてなければCronが起動していない可能性があります。ので起動させておきましょう。
 再起動:service crond restart
 起動 :service crond start

これで、私は「0 16 * * *」で設定したので、16時に起動されるのを待って、確認します。

起動時刻になっても起動しない場合は、「/var/spool/mail/testuser」を見て、
届いたメールから、エラーの内容を確認しましょう。



【Linux】javaのアンインストール(RPMで行う)

2008年11月14日 15時32分12秒 | linux bash
Linux コンピュータで RPM が利用できる場合は、RPMでアンインストールを行います。
まずは、Java がインストールされているかどうかを確認します。
Java のインストールに RPM を使用していない場合は、次の手順を実行する必要はありません。
 1. ターミナルウィンドウを開きます。
 2. rootとしてログインします。
 3. rpm -q jdk と入力します。(またはjreなど)
 4. jdk-<バージョン番号>-fcs といった形式のパッケージが検出された場合、
   Java は RPM を使用してインストールされています。

JDK をアンインストールするには、rpm -e jdk-<バージョン番号>-fcs と入力します。

【Tomcat】UnsupportedEncodingExceptionで起動しない

2008年11月05日 15時14分15秒 | linux bash
tomcatのconfディレクトリ内のxmlファイルを開いて
encoding='cp932'になってる箇所があったらutf-8に修正すること

encoding='cp932' → encoding='utf-8'

出ていたエラー-----------------------------------------------------------------
2008/11/05 14:56:28 org.apache.catalina.core.AprLifecycleListener init
情報: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Tomcat 6.0\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\PC Connectivity Solution\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Java\jdk1.6.0_07\bin;C:\Program Files\All-In-One-Eclipse\eclipse\plugins\org.apache.ant_1.6.5\bin;C:\Program Files\doxygen\bin;C:\Program Files\TortoiseSVN\bin
2008/11/05 14:56:29 org.apache.coyote.http11.Http11Protocol init
情報: Coyote HTTP/1.1を http-8080 で初期化します
2008/11/05 14:56:29 org.apache.catalina.startup.Catalina load
情報: Initialization processed in 3445 ms
2008/11/05 14:56:29 org.apache.naming.NamingContext lookup
警告: 参照の解決中に予測しない例外が発生しました
java.io.UnsupportedEncodingException: cp932
at sun.nio.cs.StreamDecoder.forInputStreamReader(StreamDecoder.java:52)
at java.io.InputStreamReader.<init>(InputStreamReader.java:83)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.createReader(XMLEntityScanner.java:1901)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.setEncoding(XMLEntityScanner.java:445)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanXMLDeclOrTextDecl(XMLDocumentFragmentScannerImpl.java:979)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$XMLDeclDriver.next(XMLDocumentScannerImpl.java:808)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:450)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse

【bash】 「"」、「'」、「`」の違い

2008年11月03日 20時23分30秒 | linux bash
「"」(ダブルクォーテーション)、
「'」(シングルクォーテーション)、
「`」(バッククォーテーション)にも違いがあります。

変数 name に"pwd"という値を設定。
この変数 name をそれぞれで囲みechoを実行する

・「"」ダブルクォーテーションの場合
 $echo "$name"
 pwd
 「"」は変数の中身を表示します。

・「'」シングルクォーテーションの場合
 $echo '$name'
 $name
 「'」は文字列をそのまま表示しています。

・「`」バッククォーテーションの場合
 $echo `$name`
 /usr/local/test
 「`」は変数の中身をコマンドとして実行しています。

●自分メモ(料理)

2008年11月02日 20時29分45秒 | other
あまりもので煮物or炒めものを作るとき用のメモ。
買ったソースは添加物もりもりなので、
なるべく調味料を使って簡単に調理。

■煮物

 醤油  大3
 砂糖  大1と1/2
 みりん 大1

■味噌炒め

 酒   小2
 砂糖  大2
 味噌  大3
 醤油  小1/2