• ベストアンサー

ログローテート

今まであまり意識しなかったんですが、ふと疑問に思ったので教えてください。 今までアプリケーションログをローテートする場合に、以下のようなスクリプトを書いていました。 cp -p log log.old・・・(1) cp /dev/null log・・・(2) でもこれって(1)と(2)の間でlogに書き込みがあるとその箇所が消されてしまうんじゃないか?と思いますがこの認識は合っていますでしょうか? また、linuxのlogrotateは書き込み中であっても欠落なくローテートされることが保証されているのでしょうか?

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

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

その認識であってます。 ログのローテートはcpじゃなくてmvを使う必要があります。標準のlogrotateはmvを使っています。 ただ、mvしても元のファイルに書き続けるので、kill -HUP プロセス番号 とか、/etc/init.d/サービス名 reload とかして、新しいログファイルに書くようにします。当然、アプリケーション側でSIGHUPを受け取るとログファイルをクローズしてオープンしなおす機能が必要です。もしくは再起動するか。

yyywww
質問者

お礼

notnotさん、ご回答ありがとうございます。 また、返信遅れましてすみませんでした。 mvとkill -HUPの間の書き込みはどうなるのかな?とも思いますが、 ここまで回答いただいたので後は自分で試してみます。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • logrotateでログの整理中、httpdの再起動で不具合

    logrotateでログが整理された後、 httpサーバーが再起動されますが、 その後、WEBサイトが見れなくなります。 /etc/init.d/httpd status で見るとrunning ですが、止まっています。 /etc/init.d/httpd restart すると回復します。 /etc/logrotate.d/httpdの中の再起動部分でおかしくなっています。 /var/log/httpd/*log { missingok notifempty sharedscripts postrotate /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true endscript } /bin/kill のところです。 毎回おかしくなる訳ではなく、たまになると言う頻度、httpd restart で回復します。 どういう対応すれば良いでしょうか。。

  • apacheのログファイルがいつの間にか消える

    Redhat Linux7.0J apache_1.3.19 openssl_0.9.6b apache_1.3.19+ssl_1.44の環境で 下記のログファイルの中身が、いつの間にか 全て消えてなくなるのです。  マシンを再起動すれば、たちまちログ出力は 開始されるのですが、また気付いたら消えています。  消えるまでにどれだけの日数がかかるのかは 分かりません。サーバの再起動は3ヶ月に1回ぐらいは 実施していますが、毎回logのことを調べてはいないので どのタイミングで消えたかは全く不明です。 定期的に消えるような処理が自動的に動いているのでしょうか?(それはcronという機能のことですか?cronの設定とかよく分からないのですが現状どのようなcronが動いているか確認する手段(コマンド)はありますか?) [ログファイルは、下記のように1ファイル/1Wずつ保存されていて気付いたら中身が消えている] /usr/local/apache/logs/httpsd_access_log ・・・ /usr/local/apache/logs/httpsd_access_log.4 /usr/local/apache/logs/httpsd_error_log ・・・ /usr/local/apache/logs/httpsd_error_log.4 ログのrotationについては /etc/logrotate.d/syslogファイルに 下記を記述しています。  この記述方法が悪いのでしょうか? インストールの初期状態で自動的に記述されていた maiilogファイルなどを真似して記述したのですが 間違いがありますか? [/etc/logrotate.d/syslogファイルの記述] /usr/local/apache/logs/httpsd_access_log { postrotate /bin/kill -HUP `cat /var/run/xinetd.pid 2>/dev/null` 2>/dev/null || true endscript } /usr/local/apache/logs/httpsd_error_log { postrotate /bin/kill -HUP `cat /var/run/xinetd.pid 2>/dev/null` 2>/dev/null || true endscript }

  • logrotateの実行時間

    logrotateで「/etc/cron.daily/」以下に日次で実行したいスクリプトを置いていますが、 一部のログファイルを「0時」にローテートされるようにしたいです。 ネットで検索してみたところ「/etc/crontab」にrun-partsの指定があるという資料は見つけたのですが 私のサーバ(CentOs6)にはそのような記述が見当たりません。 「/etc/cron.daily0」のようなディレクトリを作成し、そこに記述された内容は毎日0時に実行するといったことは可能でしょうか?

  • bashのaliasに引数を渡すには?

    sshでログインしたubuntuサーバー上で時間のかかるシェルスクリプト(例えば hoge.sh) を実行した後、sshから抜けてもプロセスを走り続けさせるためにnohupを使っています。 nohup hoge.sh > out.log 2> err.log < /dev/null & これはタイプ量が多いし、時間のかかるシェルスクリプトはhoge.shだけではないので、実行したいシェルスクリプトの名前の部分を引数にした下記のようなエイリアスを作りたいのですが、bashのaliasには引数が渡せないとの事です。 alias run='nohup $1 > out.log 2> err.log < /dev/null &' "alias 引数"で検索すると「関数を使うと良い」というページがいくつか見つかりますが、関数ではsshから抜けると終了してしまいます。どうするのが良いでしょうか?

  • PostgreSQLをサーバ起動時にstartさせたい

    PostgreSQLをサーバ起動時にstartさせたいと思っています。 /etc/rc.d/rc.localに下記を追記しましたが、起動してくれません。ログファイルも作成されていませんでした。 echo -n "Starting PostgreSQL: " su -l pgsql -s /bin/sh -c "/usr/local/pgsql/bin/pg_ctl -l /var/log/postgresql.log start > /dev/null 2>&1" < /dev/null echo "done." 何が悪いのでしょうか?PostgreSQLは手動でstartすることはできます。 また、PostgreSQLの起動スクリプトを作成し、webminで制御したいと思うのですが、PostgreSQLの起動スクリプトの書き方について参考になるHPがあれば紹介していただきたいと思っています。 よろしくお願いいたします。

  • Clam Antivirusの設定について

    CentOS上でClam Antivirusをインストールしたのですが、 ログのローテーションの設定が分かりません。 教えていただけないでしょうか。 http://centos.server-manual.com/centos5_clamav.htmlを参考にして設定をしました。 以下のログローテーション設定の部分ですが、この結果が現在clamscan.log-20120801というように 月単位のファイルでしか一覧にありません。 もしDailyで見たい場合を教えていただけませんでしょうか。 以下の2つを変更すれば良いのでしょうか? monthly→dailyに変更 rotate 4→rotate 7に変更 [root@centos ~]# vi /etc/logrotate.d/clamscan ↓下記を記入 /var/log/clamav/clamscan.log { monthly rotate 4 missingok } あと以下の設定につきましても変更する必要がありますでしょうか? [root@centos ~]# vi /etc/cron.weekly/clamscan ↓下記を記入 #!/bin/bash yum -y update clamd > /dev/null 2>&1 /usr/bin/freshclam > /dev/null /usr/bin/clamscan -i -r --remove /home >> /var/log/clamav/clamscan.log 2>&1

  • ログの初期化について

    今、あるプログラムを実行中に実行ログをリダイレクトで出力しています。 プログラムを実行したままで、そのログを初期化したいのですがうまくいきません 1.java aaa >> pglog.log[Enter]で、ログを出力 2.aaaのプログラムは実行中のまま、pglog.logを初期化   cp /dev/null pglog.log[Enter]  ※コレを実行後、1度ログはZEROバイトにはなる 3.aaaのプログラムの操作する(ログ出力のため) すると、ファイルサイズが前回のログ+今回のログと なってしまいます。 また、中身も前回ログは見た目にはないのですが、全て スペースに置き換わった形であるようなのです。 ログが大きくなりすぎるのを防ぎたいのですが、 よい方法があれば教えてください! よろしくお願いします。

  • rshを使うスクリプトをバックグラウンド実行

    Linux+Perlでのお話です。 内部でsystem関数を使ってrshコマンドを実行しているperlスクリプト(以下、スクリプトAという)があります。 スクリプトAをフォアグラウンドで実行するとうまく流れるのですが、バックグラウンド実行すると、rshコマンドを実行した直後でjobが止まってしまいます。 もっと詳しく言いますと、スクリプトAのrshコマンドは、ディスクを共有しているリモートマシンに対して、スクリプトBを実行するように指示しています。 スクリプトBではとある計算を行なっており、その計算結果をファイルに出力しています。 そして、その結果をスクリプトAで読み込んで後処理を行うというものです。 ----- …(前処理)… system("rsh (ホスト名) \"(スクリプトB実行コマンド及び引数) 1> /dev/null 2> /dev/null\""); # ここでjobが止まってしまいます。 # ここで標準出力(ログファイルにリダイレクトしてる)に何か出力しようとしても、何も出力されてません。 (スクリプトBの結果ファイルの読み込み) …(後処理)… ----- Jobが止まってしまうと言っているのは、jobsコマンドで見ると"job stopped"となっている状態のことを言っています。 この状態でスクリプトBの結果はファイルに出力されているので、rshのコマンドはうまく投げられていると思います。 (「rshやsshは標準入力が期待されてるとバックグラウンド実行が出来ない」(?)というような記述をどこかで見かけたので、念のためrshに"< /dev/null"の記述を加えてもみたのですが、変わりませんでした) その後、止まっているjobをfgコマンドでフォアグラウンドで再開させると、最後まで問題なく実行されます。 フォアグラウンドで実行すればうまくいくのに、バックグラウンドで実行すると止まってしまうのが理解出来ません。 これは何が原因なのでしょうか。 そして、どうしたら解決出来るのか。 どなたかご存知でしたら、ご教示頂きたくお願い致します。

    • ベストアンサー
    • Perl
  • /var/log/maillogへのログの書き込み方法の設定に関して

    /var/log/maillogへのログの書き込み方法の設定に関して 誠に恐れ入りますが、どなたかご教示願います。 メール送信用スクリプト実行時のメール送信処理を監視したいと考えています。 Solarisでは以下で「※メール送信処理」記載の送信履歴の取得が問題なくできました。 (1つのスクリプトファイル内での処理です) tail -1f /var/log/syslog > ${監視用ログファイル} & ※メール送信処理 kill ※tailのプロセス しかしながら、Linuxでは、同様の設定(syslog->maillog)を行っても どうも送信履歴の取得が行えません。 現状システム上で起こっている事象を確認した限り、スクリプト完了後に maillogへの書き込みを行っているようで、何とかスクリプト実行中に 同時にmaillogにも書き込み、その結果をログに出力したいと 考えていますが、どのような設定、またはLinux向けのスクリプト修正を行えば それが実現できますでしょうか?

  • Linux shell ftp 転送 エラー制御

    Linuxのshellで、ftpを使ってデータを転送するシェルを作成しています。 転送部分はうまくいき、エラー制御を考えているのですが上手くいきません。(ログは取得できてます) やりたいことは、ftp転送で失敗したかどうかの判定をしたい。ということです。 過去ログ等見ていて、ログファイルからエラーNoをgrepして判断する。というやり方があったので 試して見ましたが、構文が正常に書けていないようです。すみませんがアドバイスをお願い致します。 ftp転送終了したとします。 ログは $Log_Path/$date.txt にとってあります。 grep ^425 $Log_Path/$date.txt /dev/null if $? eq 0 then error_flag=1 exit 1 fi (エラーが発生したら、error_flagに1が入るようにしたい) エラーナンバーは425(データコネクションをオープンできない)というやつで、いいかなと思っていますが、もっと適切なものがあれば教えて下さい。(putで行っている転送の失敗を判断できればいいです) 上記の構文ではエラーが出ます。 また、 /dev/null の部分が意味が解っていません。この部分の説明をお願いできますでしょうか? 宜しくお願い致します。

このQ&Aのポイント
  • 私の母親が関西弁が嫌いな理由とは何なのでしょうか?和歌山生まれの私にとっても関西弁は馴染みのある言葉ですが、なぜ母は虫唾が走るほど嫌なのでしょうか?
  • 私自身は関西弁を使うことはあまりありませんが、どうしても無意識に「〇〇やねん」「そ(せ)やねん」などの言葉が口から出てしまいます。母はいつも怒ってきますが、どうすれば良いでしょうか?
  • 標準語を話したいと思っている私ですが、関西生まれ関西育ちで関西に住んでいるということで、標準語を話すことはおかしいのでしょうか?どう対応すれば良いでしょうか?
回答を見る