Приостановите запуск script в терминале Mac и затем возобновите его позже.

Как я могу приостановить (не остановить) запущенный скрипт из Terminal в OSX, чтобы возобновить его позже с того момента, когда он приостановился?

Ответ 1

В дополнение к полезным ответам @devnull и @DavidW:
Здесь удобные функции для приостановки (приостановки)/возобновления script по имени из любой оболочки (а не только той, которая запустила script):

Передайте script имя файла (ов) (без пути):

suspend-script someScript ...

и позже:

resume-script someScript ...

Обновление: добавлена ​​дополнительная функция для убийства script по имени: kill-script someScript ...

  • Работает со сценариями, выполняемыми либо bash, либо sh (что фактически является просто псевдонимом bash в OSX).
  • Если запущено несколько экземпляров script, нацеливается только самый последний запуск.
  • Код выхода будет отличным от нуля в случае сбоя (в том числе не найти текущий script по данному имени).
  • suspend-script и resume-script: если процесс script уже находится в желаемом состоянии, операция не выполняется (и об ошибке не сообщается).

Функции (например, поместите их в ~/.bash_profile):

suspend-script() {
  [[ -z $1 || $1 == '-h' || $1 == '--help' ]] && { echo "Usage: $FUNCNAME scriptFileName ..."$'\n'"Suspends the specified bash/sh script(s)."; return $(( ${#1} == 0 )); }
  local ec=0
  for p in "[email protected]"; do
    pkill -STOP -nf '/?(bash|sh)[ ]+(.*/)?'"$p"'( |$)' \
      && echo "'$1' suspended." \
      || { ec=$?; echo "ERROR: bash/sh script process not found: '$p'" 1>&2; }
  done
  return $ec
}

resume-script() {
  [[ -z $1 || $1 == '-h' || $1 == '--help' ]] && { echo "Usage: $FUNCNAME scriptFileName ..."$'\n'"Resumes the specified bash/sh script(s)."; return $(( ${#1} == 0 )); }
  local ec=0
  for p in "[email protected]"; do
    pkill -CONT -nf '/?(bash|sh)[ ]+(.*/)?'"$p"'( |$)' \
     && echo "'$1' resumed." \
     || { ec=$?; echo "ERROR: bash/sh script process not found: '$p'" 1>&2; }
  done
  return $ec
}

kill-script() {
  [[ -z $1 || $1 == '-h' || $1 == '--help' ]] && { echo "Usage: $FUNCNAME scriptFileName ..."$'\n'"Kills the specified bash/sh script(s)."; return $(( ${#1} == 0 )); }
  local ec=0
  for p in "[email protected]"; do
    pkill -nf '/?(bash|sh)[ ]+(.*/)?'"$p"'( |$)' \
     && echo "'$1' killed." \
     || { ec=$?; echo "ERROR: bash/sh script process not found: '$p'" 1>&2; }
  done
  return $ec
}

Ответ 2

Если вы используете BASH в качестве оболочки (которая является оболочкой по умолчанию на Mac), вы можете использовать BASH встроенные возможности управления заданиями.

Если на переднем плане вашего терминала работает script, вы можете нажать Control - Z, чтобы приостановить script. Это приостановит работу script.

Чтобы перезапустить его, введите jobs, и там будет показано приостановленное задание. Введите fg или более конкретный fg %x, где x - номер приостановленного задания.

$ test.pl   # Test script (prints out Foo every two seconds
Foo!
Foo!
^Z
$  # Job has been suspended
$ jobs
[1] + Stopped                  ./test.pl
$ fg %1  #Restarts Job #1
Foo!

Ключ Control-Z, который приостанавливает задание, является значением по умолчанию, но может быть изменен. stty может изменить это и покажет вам текущее значение по умолчанию:

$ stty -a     
speed 9600 baud; 40 rows; 120 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
        -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
        -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
        -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
        -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
        eol2 = <undef>; erase = ^H; intr = ^C; kill = ^U; lnext = ^V;
        min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
        stop = ^S; susp = ^Z; time = 0; werase = ^W;

Вы можете видеть, что самая последняя строка имеет susp = ^Z. Это ключ, который приостановит ваш script. В этом случае это Control-Z.

Вы также можете использовать команду bg, чтобы приостановить работу в фоновом режиме. Однако это фоновое задание прекратится, когда вы закроете окно оболочки/терминала, если вы не добавили nohup в начало команды.

Ответ 3

Найдите идентификатор процесса работающего script.

Чтобы остановить (или то, что вы называете паузой), script, скажите:

kill -SIGSTOP PID

Чтобы возобновить приостановленный (или приостановленный) процесс, скажите:

kill -SIGCONT PID

(где PID относится к числовому идентификатору процесса.)

Ответ 4

echo Press any key to continue... read blah

Тогда просто ничего не делайте с переменной. Это настолько близко к функциональности pause которую я использовал в пакетных сценариях DOS, с которыми я сталкивался.