并行 shell 执行和参数

Parallel shell execution and parameters

我正在监控一个正在接收日志文件的文件夹。 对于收到的每个日志文件,我需要通过 SCP 将其发送到远程服务器。 SCP 传输是通过 transfer.sh 脚本完成的。 由于我需要为每个文件执行传输,因此单个文件可能会延迟其他新文件。我想为目录中的每个文件 "create" 一个新的 并行 进程。

MONITOR_FOLDER='/repository/'
PATTERN='log_*'

    for log_file in $MONITOR_FOLDER$PATTERN     
        do              
            echo "$(date +%c) monitor() Processing $log_file CDR file..."
            parallel --will-cite -n0 "sh transfer.sh $log_file 1" ::: {1..1}
        done

$MONITOR_FOLDER$PATTERN 可以 return 0 个或更多文件。 当文件超过 1 个时,我想为每个文件创建一个并行进程。 以下命令显示正确的列表。

ls $MONITOR_FOLDER | grep 'log_*' 

问题:

1) 对于每个条目,将其用作我的 shell 脚本的参数,同时创建一个新进程 没有 循环

我认为问题出在您的代码中:

 for log_file in $MONITOR_FOLDER$PATTERN

请完成循环过程并研究循环的工作原理,在您的情况下 for

例如

 for i in '1 2 3 4 5'     # it will iterate from 1 to 5

但是

  for i in $VAR    # it will iterate over `echo $VAR` means its value

因此在您的情况下,变量 log_file 将获得第一个值 /repository/log_* 但不是其内容。

要使您的代码正常工作,您可以这样做。

 for log_file in `ls $MONITOR_FOLDER$PATTERN`

I'm monitoring a folder which is receiving log files. For each log file received, I need to send it to a remote server via SCP. SCP transfer is done via transfer.sh script.

这部分很简单:

MONITOR_FOLDER='/repository/'
PATTERN='log_*'

parallel -j0 'echo "$(date +%c) monitor() Processing {} CDR file..."; sh transfer.sh {} 1' ::: $MONITOR_FOLDER$PATTERN

或者:

ls $MONITOR_FOLDER | grep 'log_*' | parallel -j0 'echo "$(date +%c) monitor() Processing {} CDR file..."; sh transfer.sh {} 1'

Since I need to perform a transfer for each file, its probable that a single file may delay other new files. I would like to "create" a new parallel process for each file in my directory.

如果您允许一个文件被复制多次并且拥有与文件一样多的 scp 运行,这也很容易。只需将 & 添加到命令中:

MONITOR_FOLDER='/repository/'
PATTERN='log_*'

for log_file in $MONITOR_FOLDER$PATTERN       
    do              
        echo "$(date +%c) monitor() Processing $log_file CDR file..."
        sh transfer.sh $log_file 1 &
    done

如果出现以下情况,它会变得更加棘手:

  • 你最多同时需要12个scp的运行
  • 您只想复制一个文件一次

但你或许可以使用这个:http://www.gnu.org/software/parallel/man.html#EXAMPLE:-GNU-Parallel-as-dir-processor

notifywait -q -m -r -e MOVED_TO -e CLOSE_WRITE --format %w%f $MONITOR_FOLDER |\
grep 'log_*' | parallel -j12 'echo "$(date +%c) monitor() Processing {} CDR file..."; sh transfer.sh {} 1'

它只会坐在那里等待写入新文件。所以想要阻止它,就必须杀了它。