3

Мне нужно настроить пакетное задание bash (сжатие файлов 5.1k на месте) так, чтобы, если мне нужно было остановить / возобновить работу, оно подождет, пока оно окажется "между" файлами (только что закончил один и не запустил другой).

Мое сжатие выглядело бы как pigz -9 -- rsnc* если бы все работало одновременно, и я обдумывал что-то вроде:

ls rsnc* | while read file 
  do pigz -9 -- $file
  if [ -f .intr ]
    then break
  fi
done

Является ли это надежным средством достижения моей цели? Есть ли способ лучше?

1 ответ1

2

Вы можете trap [ 1 ], [ 2 ] сигнал Ctrl+C , INT и wait окончания каждого процесса.

#!/bin/bash

trap ctrl_c INT

function ctrl_c() {
        wait   # wait for the end of all child processes    
        exit   # <<--- put here your exit code exit 1, ... 
}

shopt -s nullglob
for f in rsnc*
do
    pigz -9 -- $file &   # Execute in background
    wait  $!             # Wait for the end of the last command 
done

Заметка
Существует много способов циклического перебора всех файлов в каталоге [ 3 ], но всегда лучше избегать парсинга вывода команды ls [ 4 ].

Рекомендации

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .