Допустим, CSV выглядит так:
Spaceballs,/mnt/Movies/Comedy/Spaceballs.avi
Star Wars IV: A New Hope,/mnt/Movies/SciFi/starwars-4.avi
Затем вы можете сделать что-то вроде:
#!/bin/bash
DEST=/path/to/SortedMedia
for file in $( cut -d, -f 2 /path/to/movielist.csv ); do
cp "$file" $DEST/"${file##*/}"
done
Кажется ненужным помещать его в фоновый режим, если вы все равно хотите дождаться его завершения, но:
./extract.sh 1553212800 1554854400 &
pid=$!
if wait "$pid"; then
./extract.sh 1554854400 1556668800 &
fi
Встроенная функция wait
завершается с помощью:
Returns the status of the last ID; fails if ID is invalid or an invalid option is given.
Вы должны либо просто удалить &
в конце каждой команды, что заставит оболочку запускать команды , а не как фоновые задачи, или, если вам действительно нужно запускать их как фоновые задачи (поскольку вы также делаете другие вещи параллельно ), вам нужно будет сохранить PID процесса в переменной, а затем wait
для его завершения:
./extract.sh 1553212800 1554854400 & pid="$!"
# other things
wait "$pid"
./extract.sh 1554854400 1556668800 & & pid="$!"
# other things (again)
wait "$pid"
# etc.
Лично, если бы у меня был длинный список таких команд, я бы поместил их все в один скрипт, например
#!/bin/sh
./extract.sh 1553212800 1554854400
./extract.sh 1554854400 1556668800
(примечание, нет фоновых заданий)
Тогда я бы, наверное, начал скрипт сnohup
:
nohup./script.sh &
Это позволило бы мне выйти из системы, а затем снова войти в систему, чтобы увидеть, выполняется ли еще процесс сценария (, проверив с помощьюps
).
Или я просто запустил tmux
сеанс, затем запустил скрипт как обычный (нетnohup
)и нажал Ctrl+Bd , чтобы отсоединиться от него. Позже я мог вернуться к тому же сеансу оболочки с помощью tmux attach
. См. руководство tmux
.
Хотя это может и не дать прямого ответа на заданный вопрос, я решил предложить это решение, тем более что похоже, что OP еще не остановился на конвейере.
Во многих оболочках Posix можно объединить несколько команд вместе с помощью символа &&
. По сути, это означает выполнение первой команды, а затем после того, как первая команда завершится без ошибок, выполните следующие команды после &&
. Например:
./extract.sh 1553212800 1554854400 &&./extract.sh 1554854400 1556668800 &
Это, однако, запустит все как один большой фоновый процесс. Кроме того, вы рискуете никогда не запускать команды, следующие за командой, выдающей ошибку. Таким образом, в сценарии, подобном этому:
./valid_run.sh &&./throws_error.sh &&./second_valid_run.sh
Если valid_run.sh
работает правильно, а throws_error.sh
— нет, second_valid_run.sh
не запустится.
В качестве альтернативы более чистым подходом к этому было бы хранить все ваши команды в скрипте-оболочке BASH, а затем запускать этот скрипт:
обертка.sh:
#!/bin/bash
./extract.sh 1553212800 1554854400
./extract.sh 1554854400 1556668800
командная строка:
$./wrapper.sh &
Думаю, это лучший способ организовать ваши команды.