簡體   English   中英

從cron運行時,Perl腳本不會將STDOUT輸出到文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM