簡體   English   中英

我可以在這種情況下使用文件鎖定嗎?

[英]Can i use file locking in this scenario?

請我有一個概念性的問題。 我有兩個進程在同一目錄中輸出同名文件,然后在 perl 腳本中執行/讀取該文件。 這兩個進程可以同時運行,恐怕文件有可能被另一個進程覆蓋,因此其中一個進程執行了不正確的源文件。 基本上這行是這樣的:(這兩行對兩個進程都是通用的)

$cmd = `my_script.pl`;  ## This generates runx file
$cmd = `source runx | grep - i "Error";`

注意:我無法控制文件名,我必須同時運行這兩個進程

我可以在第一個命令之后使用排他文件鎖來防止串通嗎?

您鎖定的文件不一定是您要保護的文件。

use Fcntl qw( LOCK_EX );

my $output;
{
   my $script_qfn = 'my_script.pl';
   my $lock_qfn  = $script_qfn . '.lock';

   open(my $fh, '>', $lock_qfn)
      or die("Can't create lock file \"$lock_qfn\": $!\n");

   flock($fh, LOCK_EX)
      or die("Can't lock \"$lock_qfn\": $!\n");

   system { $script_qfn } $script_qfn;
   $output = `source runx | grep -i Error`;
}

但是為什么不讓my_script.pl將其 output 發送到 STDOUT? 那么就不需要鎖了。 您可以簡單地使用以下內容:

my $output = `my_script.pl | sh | grep -i Error`;

調用system的三種方式:

  • system($shell_command)
  • system($prog, @args) 必須至少有一個 arg。
  • system({ $prog } $arg0, @args) 0+ 個參數。

在這種情況下,我們沒有 shell 命令,也沒有任何參數,所以我們不得不使用第三種方法(或者構建一個 shell 命令,比如說,使用 String::ShellQuote 的shell_quote )。 使用system($script_qfn)會引入代碼注入錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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