Как написать сценарий bash для запуска следующей команды тогда и только тогда, когда процесс предыдущей команды завершен

Допустим, 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
0
22.05.2019, 23:51
3 ответа

Кажется ненужным помещать его в фоновый режим, если вы все равно хотите дождаться его завершения, но:

./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.

1
28.01.2020, 02:30

Вы должны либо просто удалить &в конце каждой команды, что заставит оболочку запускать команды , а не как фоновые задачи, или, если вам действительно нужно запускать их как фоновые задачи (поскольку вы также делаете другие вещи параллельно ), вам нужно будет сохранить 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.

1
28.01.2020, 02:30

Хотя это может и не дать прямого ответа на заданный вопрос, я решил предложить это решение, тем более что похоже, что 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 &

Думаю, это лучший способ организовать ваши команды.

0
28.01.2020, 02:30

Теги

Похожие вопросы