Запуск / остановка команды в терминале без вмешательства человека?

Вы можете использовать параметр -s zfs receive, который сохранит возобновляемый токен на принимающей стороне в случае сбоя передачи. Это зависит от того, используете ли вы netcat (nc) или SSH.

На машине recv (только netcat):

nc -l | zfs receive -s -v tank/dataset

На машине send:

Начните с обычного send:

zfs send -v snapshot | nc

zfs send -v snapshot | ssh ... zfs receive -s -v tank/dataset

Если передача не удалась, перейдите на машину recv и введите:

zfs get all tank/dataset

Получите receive_resume_token и перейдите на машину send:

zfs send -v -t | nc <хост> <порт>

zfs send -v -t <токен> | ssh ... zfs receive -s -v tank/dataset

Вот так :)

0
26.03.2017, 17:40
2 ответа

Вы можете запустить команду в фоновом режиме, а затем заснуть на 5 секунд на переднем плане и затем убить фоновую команду.

  • Запустите команду в фоновом режиме:

    command &
    
  • Сохраните PID команды в переменной:

    command_pid=$!
    
  • Засыпаем на 5 секунд:

    sleep 5
    
  • Убить фоновый процесс:

    kill "$command_pid"
    

Теперь вы можете добавить паузу, поместить все в цикл и т.д.

Loop:

for ((i=0; i<1000; i++)); do
    crunch 7 7 abcdefghijklm &
    command_pid=$!
    sleep 5
    kill "$command_pid"
    sleep 5 #pause
done
2
28.01.2020, 02:19

Предполагая, что timeout(1) доступен, команда shell

timeout 5s whateverthatcommandis; sleep 99

должна убить программу через пять секунд (предполагая, что программа хорошо себя ведет...), а затем sleep на любое количество xx секунд. Затем эти команды могут быть завернуты в какой-нибудь цикл по мере необходимости; при условии наличия seq (на BSD вместо этого можно использовать jot) типичный цикл может выглядеть так:

for n in `seq 1 1000`; do timeout 5s whateverthatcommandis; sleep 99; done

Цикл shell, кстати, может быть несколько более разборчивым в ZSH:

repeat 1000 { timeout 5s whateverthatcommandis; sleep 99 }
2
28.01.2020, 02:19

Теги

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