并行 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'
它只会坐在那里等待写入新文件。所以想要阻止它,就必须杀了它。
我正在监控一个正在接收日志文件的文件夹。 对于收到的每个日志文件,我需要通过 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'
它只会坐在那里等待写入新文件。所以想要阻止它,就必须杀了它。