Я хотел бы иметь возможность запустить команду сейчас, но она должна запускаться только после завершения старой команды (которая уже выполняется).

Например, скажем, я копирую большой файл по сети, действие, которое уже насыщает мою пропускную способность сети. Затем я хочу скопировать второй большой, менее важный файл в тот же пункт назначения, но для того, чтобы первая копия завершилась как можно скорее, я хотел бы отложить эту вторую копию до завершения первой.

Обычно я бы сделал это:

10 минут назад:
cp large_file_urgent ~/networkmnt/
Настоящее время:
sleep <some_guesstimated_time_for_old_cp_to_finish> && cp large_file_lessimportant ~/networkmnt

Есть ли более умный способ сделать это? Могу ли я как-то сказать второму cp ждать, пока не завершится PID первого cp ?

Это на Ubuntu 13.04 (в случае, если это имеет какое-либо значение).

3 ответа3

4

Если вы заранее знаете команды, которые вам нужно выполнить, вы можете просто сделать

cp file1 file2; cp file3 file4

Если вы уже запустили первую команду и находитесь в той же оболочке, вы можете нажать Ctrl+Z, затем bg чтобы поместить первую команду в фоновом режиме, а затем вызвать wait для номера задания или PID, чтобы дождаться его завершения. Например:

$ sleep 30
^Z
[1]+  Stopped                 sleep 30
$ bg
[1]+ sleep 30 &
$ wait %1; echo "next command"
[1]+  Done                    sleep 30
next command
2
cp largefile1 somedestination

...Время проходит...

wait $(pidof cp)
cp largefile2 someplace

Встроенное ожидание bash приостановит работу до завершения заданного задания / процесса (или всех заданий, если оно не указано), прежде чем продолжить.

1

Вы можете проверить, что процесс все еще выполняется, используя файловую систему /proc :

while test -d /proc/$cp_pid; do
  sleep 10
done 
cp next_big_file network

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