• ベストアンサー

perlのファイルへの書き込みついて

perl scriptにて処理を/var/log/messages等に、 エラーや実行結果を出力したいと考えています。 messagesログは他のスクリプトも使っているので、 他のプロセスがmessagesログを使っていたらすぐに書き込まずに待機して その処理が終わった後に書き込みを行うようなことをやりたいのですが、 どのようにしたら可能でしょうか。 出来ればCPAN等は使わずperl標準の機能で実装できたらと考えています。 perlのバージョンは5でお願いします。

noname#159383
noname#159383

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1620/5655)
回答No.1

ふつうプログラムが /var/log/messages に直接出力するようなことはしないような。 Sys::Syslogモジュールを使うとこだと思いますが CPANを使いたくないということであれば system()でloggerを呼び出すとかではないでしょうか。

noname#159383
質問者

お礼

早速の回答ありがとうございいます。 仰るとおり直接/var/log/messagesに直接書き込むのは乱暴と言うか・・・危険ですね。今回は回答の通り、system関数でloggerを呼び出すことにします。 ちなみに興味本位でご存知でしたら教えていただきたいのですが、 特定のファイルに対して別のプロセスによる書き込みがあった場合に、その対象のファイルの書き込みが終わるまで待機して、書き込みが終わった後にファイルの書き込みを行うような事は、perlで出来るんでしょうか? 質問ばかりですみません。

関連するQ&A

  • /var/log/maillogへのログの書き込み方法の設定に関して

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

  • cronでのPerlスクリプト実行

    少し前に同様の質問をしましたが、やはり解決していませんでした。 #!/usr/bin/perl open(OUT,">/home/test/test.log"); print OUT "OK"; close(OUT); このスクリプトをcrontabに以下のように記述しました。 0 0 * * * /home/test/test.pl > /dev/null 2>&1 パーミッションは省略します。 このようにすると、正常にtest.logが出力されました。 しかし、本当に実行したいスクリプトを同様にしたところ、 正常に動作しませんでした。cronログには記録されます。 実際のスクリプトは長いのでここには掲載できませんが、 主な処理はおおよそ次のようなことをしています。 ・pmとplモジュールがあり、plからpmを呼び出している。 ・plもpmも自作のユーザ関数の組み合わせ ・ファイルはtestユーザが所有し、実行権限は777。  (動作確認後、徐々に落としていきます) ・plでは、use encoding 'utf8'。 ・スクリプトにオプションを付けて、引数を読み込む。 ・loggerでsyslogへ結果を出力。 ・子プロセスを生成して処理の一端を行わせている。 ・opendir、readdirなどを使用。 ・xxxxxx.datファイルを読み書きしている。 ・CPANにあったメール送受信モジュールを使用している。 ・ファイルをbz2圧縮している。 などです。 コマンドラインから実行すると確実に正常に動作します。 気になるのはPerlスクリプトの内容でモジュールを使うときは、 パスが通っていてもフルパス指定しないといけないのでしょうか? しかし、フルパスと言ってもせいぜいsystem()で実行するコマンドを フルパスにするくらいしか思いつきません。 うまく実行できない理由として考えられる可能性があることを 教えてもらえませんか? 根本的な解決としては、cronでの実行とコマンドラインからの実行は 何が違うのかが明確になれば対処できるのかもしれません。 よろしくお願いします。

  • Linux上でtcpdumpの出力をperlで処理したいと考えています

    Linux上でtcpdumpの出力をperlで処理したいと考えています。 下記のようにtcpdumpの標準出力をperlの標準入力で受け取ろうとしても tcpdumpの処理が終わらないためパイプ(|)経由でperlにデータが渡ってきません。 [test.pl] $|=1; foreach(<>){ print "--- $_"; } exit; Linux上のコマンド tcpdump -l | ./test.pl これをteeに置き換えるとtcpdumpの出力はリアルタイムに表示されます。 tcpdump -l | tee a.log 質問:perlでteeを作ることはできますか?

    • ベストアンサー
    • Perl
  • Perl ファイルハンドルを閉じずに反映させる

    お世話になっております。 Perl(プログラミング言語)について質問です。 openメソッドで開いたファイルハンドルに print文で書込みを行った際に、ファイルハンドルをcloseせずに、 書込みを反映させる方法はありますか? 開くのはファイルではなく(他プロセスへの)パイプです。 $| を設定してもだめでした (例としては perl1.pl , perl2.pl を用意する <perl1.pl> $i; open(OUT,"| perl2.pl") while(1){ print OUT "$i" $i++  } close(OUT) <perl2.pl> while( <STDIN> ) { print $_; } のようなことをやりたいです。 上記のようなスクリプトを実行したところ、 perl1のcloseが実行されるまで反映されません。 これをcloseをせずに反映させる方法はありますでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • シェルスクリプトでsyslogを別ファイルに追記

    Linuxとシェルスクリプトの超初心者です。 よろしくお願いします! 下記のようなシェルスクリプトを作りたいのですが、アドバイスをよろしくお願いします。 例) (1)/var/log/messagesを/tmp/syslogAllとしてコピーする (2)一日一度のcronで、messagesの新しいログ部分のみをsyslogAllに追記していく。 (1)部分は問題ないのですが、(2)の「messagsの新しいログ部分のみをsyslogAllに追記していく」方法のアドバイスをよろしくお願いします。 一応、自分なり以下の通り考えたのですが、普通じゃなさそうなので・・・(^^; ※syslogAllの最後の行(keyword)を取得し、messagesをgrepした後リダイレクトで追記していく。 grep -A 10000 keyword /var/log/messages | grep -v keyword >> /tmp/syslogAll どうぞ、よろしくお願いいたします!

  • Perlのファイル操作の置換について

    Perlを利用し、ファイル内の置換操作を行いたいと思います。Perlに関して全く無知なので誰か教えてください。 変換したい内容を下に記載します。 (1)html:button value="aaa" name="bbb" c:button property="${aaa.bbb}"                      ↓↓  (2)html:button value="aaa" name="bbb" c:button property="${aaa.bbb}" 上記の変換ではvalueとnameがpropertyになる (3)html:button value="xxx" var="yyy"        ↓↓ (4)c:button prop="xxx" id="yyy" (3)に関してはvalueとvarの間に何か他の処理が入ってもvalueとvarだけを特定し、変換できるScript文にしたいです。 言葉足らずだったらすみません。誰か教えて下さい。

    • ベストアンサー
    • Perl
  • IISでCGIとしてのPerlが動かない

    Win2K ProにてIISでローカルサーバーでサーバーサイドスクリプトの勉強中です。 ASPは標準でついているので、PerlとPHPを組み込みました。 PHPは内部プロセス型ではなく、CGIバージョンですが、正常動作しました。 もちろんASPも。 それで問題なのですが、Perlがどうしても動きません。 PHPと同じように実行ファイルのパスや拡張子の設定はできているはずです。 しかし、いつまでたっても出力が出ず、2分くらいたってCGIタイムアウトとなってしまいます。 PerlにはActive PerlとCygwin付属のPerl両方試しましたが、タイムアウトです。 ファイルをコンソール上で実行してみましたが、Active PerlもCygwinのPerlも、期待通りの出力がなされています。 ちなみに、shファイルをCygwinのbashに関連付けて、実行させましたが、コンソール上での出力とはうらはらに、ブラウザ上ではやはりタイムアウトとなりました。 PerlのソースはいずれもほかのところのApacheでは動いているものです。 httpヘッダも正常です。 ソースの文字コードは英語のみ、EUC、改行コードcr+lf、lfのみなど、いろいろ試しましたがダメでした。 なにが原因なのでしょう。 IISを使っている方、アドバイスお願いします。

  • cpanのperlモジュール

    cpanのperlモジュールをインストールしないで使用する方法が下記のサイトに記載されているのですが、うまくいきません。 http://allabout.co.jp/career/cgiperl/closeup/CU20040805A/index4.htm use libの使用法を詳しく分かる方がいましたら助けてください。 私が実装したいのは下記のサイトにあるRSS Generatorというスクリプトです。 http://hail2u.net/rss/#use_example こちらの方も合わせてお願いします

  • PHPスクリプトでperlスクリプト

    はじめまして。PHP初心者です。助け舟をお願いします。 PHPスクリプトで、formの表示からデータの受け取り→ファイルに書込み→終了画面の表示ができるスクリプトを書くことが出来ました。 これをphpスクリプト1とします。 POSTで受け取った変数を元に処理した変数を返すperlスクリプトがあります。 これをperlスクリプト1とします。 perlスクリプト1をphpスクリプトにすることは私には困難なため、phpスクリプト1のファイルに書き込む前に、perlスクリプト1を実行→返った変数をphpスクリプトで使用しファイルに書込み→終了画面の表示を行いたいです。 こんなことってできますか?

    • 締切済み
    • PHP
  • perlからsendmailを使う

    現在、mod_perlを使ってサイトを構築しているのですが、その中で、sendmailを使ってメールを送信している処理が遅く困っています。 その処理が遅いため、画面へのHTML出力が遅くなっています。(HTML出力処理は、メール送信処理よりさきにやっているのですが・・) 下記は、ソースの該当部分です。 直接、sendmailに渡しているのですが、 この処理がいけないのでしょうか? 何か改善方法があるようであれば教えてください。 ちなみに、通常のCGIだとforkで、別プロセスを立てて そのプロセスにメール送信をさせて、主プロセスは、HTML出力をさせることはできると思うのですが。 プロセスが常駐しているmod_perlでは、有効な手なのでしょうか。 -------------------------------------- open(SENDMAIL,"|/usr/lib/sendmail -t") or $err = 1; if ($err == 0) { print SENDMAIL $mail_body; close(SENDMAIL); $err_msg = "メール送信正常に処理しました。\n"; } else { $err_msg = "メール送信エラー:ticket_cd:$$ref{ticket_cd}\n"; } --------------------------------------

    • ベストアンサー
    • Perl