![](/img/trans.png)
[英]Log output from bash script into log file and stdout while running from perl
[英]Perl script does not output STDOUT to file when run from cron
對Perl來說還很陌生。 我在Linux機器上有一個Perl腳本,它具有自己的日志文件。 日志文件名稱可以更改,具體取決於腳本正在處理的數據(日期,文件名,數據類型等)。
某些情況下,腳本正在通過system()調用來調用本機可執行文件,這會將一些信息提供給STDOUT和STDERR-在幾分鍾內幾十到幾百行。 可執行文件完成后,腳本將繼續並將其他一些信息記錄到日志文件中。
到目前為止,該腳本僅記錄了自己的輸出,而沒有本機可執行文件的輸出,我想將其與Perl腳本登錄的文件記錄在同一文件中。 使用以下兩種方法進行了嘗試:
#!/usr/bin/perl
#some other code
@array_executable_and_parameters = qw/echo foo/ ;
open $log_fh, '>>', 'log/logfile1.txt';
*STDOUT = $log_fh;
*STDERR = $log_fh;
print "log_fh=$log_fh\n";
system( @array_executable_and_parameters);
$logfilename='log/logfile2.txt';
open(LOGFILEHANDLE, ">>$logfilename" );
*STDOUT = LOGFILEHANDLE;
*STDERR = LOGFILEHANDLE;
print LOGFILEHANDLE "Somethinglogged\n";
system( @array_executable_and_parameters);
當我手動運行腳本時有效,但從cron運行時則無效。
我知道可以通過Linux方式在crontab中進行重定向,但是隨后我必須知道要登錄的文件名,只有在某些數據到達時才能知道該文件名,因此在我看來不可行。 我還希望腳本中盡可能多的內容,而對Linux等沒有太多依賴性。我也沒有可能安裝任何額外的模塊,供Perl使用的庫,假設這只是最低限度的安裝。
如何從Perl腳本中將STDOUT和STDERR重定向到特定文件?
如果可能,如何檢測STDOUT當前使用的文件名?
重新分配*STDOUT
僅影響Perl內部STDOUT
標量的綁定。 在系統級別重定向標准輸出的正確方法是
open (STDOUT, '>&', $log_fh) or die "$0: could not: $!";
同樣,您應該從其他系統調用中報告可能失敗的錯誤(並use strict
和其他)。
cron
在主目錄中運行您的作業,因此,如果路徑$HOME/log
不存在,該腳本將無法打開日志文件句柄(靜默,因為您沒有記錄open
錯誤!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.