тайм-аут, не уничтожая процесс в ударе

После принципа KISS я просто контролировал бы свободную память с free -m попытка выполнить тот же набор пользовательских приложений в течение того же промежутка времени. Просто имейте в виду, это 'кэшировалось', на самом деле свободная память также, таким образом, Вам нужна 2-я строка, которая показывает, каковы реальные объемы используемой и свободной памяти.

Относительно ЦП — WMs обычно не делают пожирателя ресурсов ЦП собой — они делают ту реакцию на действия некоторого пользователя, таким образом, можно сравнить создания/удаления большого количества окон, переместив их и так далее.

5
31.07.2013, 00:21
3 ответа

С ksh/bash/zsh:

{
  (./slowprocess.sh >&3 3>&-; echo "$?") |
    if read -t 3 status; then
      echo "Cool it completed with status $status, do stuff..."
    else
      echo "It didn't complete, do something else..."
    fi
} 3>&1

Мы копируем исходный stdout на fd 3 (3>&1) таким образом, мы можем восстановить его для slowprocess.sh (>&3), в то время как stdout для остальной части (...) подоболочка переходит к каналу к read -t 3.

С другой стороны, если Вы хотите использовать timeout (сюда принятие GNU timeout):

timeout --foreground 3 sh -c './slowprocess.sh;exit'

избежал бы slowprocess.sh быть уничтоженным ( ;exit необходимо для sh реализации, которые оптимизируют путем выполнения последней команды в процессе оболочки).

9
27.01.2020, 20:34

Вот решение с помощью только повсеместные инструменты оболочки.

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

Таким образом вместо этого, разветвите медленный процесс и a sleep в фоновом режиме имейте их обоих, сообщает их состояние через канал и читает первое состояние, которое выходит из канала.

fifo=$(mktemp -u)  # if not on Linux, adapt to what your OS provides
mkfifo -m 600 "$fifo"
{ ./slowprocess.sh; echo z >"$fifo"; } &
sh -c 'sleep 3; echo a' >"$fifo" &
sleep_pgid=$!
read status <$fifo
case $status in
  a) echo "That process is taking a long time"; read ignored <$fifo;;
  z) echo "Done already"; kill -INT -$sleep_pgid;;
esac
rm "$fifo"
2
27.01.2020, 20:34
  • 1
    Это mktemp вызов не является портативным (не будет работать над BSDs, например, где необходимо указать шаблон), –  Stéphane Chazelas 31.07.2013, 09:00
  • 2
    pgids создается только в интерактивных оболочках. В сценариях Вам было бы нужно set -m. –  Stéphane Chazelas 31.07.2013, 09:00
  • 3
    С bash, Вам нужны кавычки вокруг переменных в перенаправленных файлах также (> "$fifo") –  Stéphane Chazelas 31.07.2013, 09:01
  • 4
    Можно хотеть установить umask кому: 077 избегать кого-то вмешивающегося в Ваш FIFO. –  Stéphane Chazelas 31.07.2013, 09:07
  • 5
    Как примечание (вероятно, не проблема к OP), асинхронным процессам перенаправили их stdin от /dev/null. –  Stéphane Chazelas 31.07.2013, 09:11

Независимо от того, что блокируется в slowprocess.sh мог быть фон так, чтобы он мог продолжиться даже после тайм-аута.

Также Вы смогли использовать a signal от timeout назад к Вашему main.sh. См. страницу справочника для timeout.

выборка от timeout информационная страница

`-s SIGNAL'
`--signal=SIGNAL'
     Send this SIGNAL to COMMAND on timeout, rather than the default
     `TERM' signal. SIGNAL may be a name like `HUP' or a number. Also
     see *Note Signal specifications::.

Необходимо было бы захватить для этого сигнала в main.sh.

Также timeout возвращает различные состояния для различных типов отказов. Вы смогли использовать их также:

   Exit status:

     124 if COMMAND times out
     125 if `timeout' itself fails
     126 if COMMAND is found but cannot be invoked
     127 if COMMAND cannot be found
     the exit status of COMMAND otherwise

Они присутствуют в переменной $?, после timeout ... выполнения строки.

0
27.01.2020, 20:34
  • 1
    я не думаю, что это может работать. Если медленный процесс является фоном затем timeout не будет видеть, работает ли это все еще. Если timeout не уничтожает процесс, затем он не возвращается. –  Gilles 'SO- stop being evil' 31.07.2013, 02:21
  • 2
    @Gilles - да это было, свободно продумал набор "возможных" решений, у меня не было времени для предоставления полных решений, таким образом, я просто обеспечил некоторые идеи, но я соглашаюсь, что они очень хорошо не исследовались и вероятно не закончат тем, что удались. Моя начальная буква думала, был то, что то, что он хотел, не было возможно. Чувствовавший немного как OP хотел иметь его пирог и съесть его также. –  slm♦ 31.07.2013, 02:27

Теги

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