Как я ограничиваю время выполнения сценария Bash

Опустите нижнее ограничение

let con = badLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -safeMargin)  
con.priority = UILayoutPriority(999)
con.isActive = true

и добавьте настройки & amp; ограничения внутри

override init(style: UITableViewCell.CellStyle,reuseIdentifier: String?)

как

override func layoutSubviews() 

называются несколько раз `

16
задан lesmana 2 January 2012 в 21:45
поделиться

4 ответа

Смотрите скрипт http://www.pixelbeat.org/scripts/timeout, функциональность которого интегрирована в более новые coreutils:

#!/bin/sh

# Execute a command with a timeout

# License: LGPLv2
# Author:
#    http://www.pixelbeat.org/
# Notes:
#    Note there is a timeout command packaged with coreutils since v7.0
#    If the timeout occurs the exit status is 124.
#    There is an asynchronous (and buggy) equivalent of this
#    script packaged with bash (under /usr/share/doc/ in my distro),
#    which I only noticed after writing this.
#    I noticed later again that there is a C equivalent of this packaged
#    with satan by Wietse Venema, and copied to forensics by Dan Farmer.
# Changes:
#    V1.0, Nov  3 2006, Initial release
#    V1.1, Nov 20 2007, Brad Greenlee <brad@footle.org>
#                       Make more portable by using the 'CHLD'
#                       signal spec rather than 17.
#    V1.3, Oct 29 2009, Ján Sáreník <jasan@x31.com>
#                       Even though this runs under dash,ksh etc.
#                       it doesn't actually timeout. So enforce bash for now.
#                       Also change exit on timeout from 128 to 124
#                       to match coreutils.
#    V2.0, Oct 30 2009, Ján Sáreník <jasan@x31.com>
#                       Rewritten to cover compatibility with other
#                       Bourne shell implementations (pdksh, dash)

if [ "$#" -lt "2" ]; then
    echo "Usage:   `basename $0` timeout_in_seconds command" >&2
    echo "Example: `basename $0` 2 sleep 3 || echo timeout" >&2
    exit 1
fi

cleanup()
{
    trap - ALRM               #reset handler to default
    kill -ALRM $a 2>/dev/null #stop timer subshell if running
    kill $! 2>/dev/null &&    #kill last job
      exit 124                #exit with 124 if it was running
}

watchit()
{
    trap "cleanup" ALRM
    sleep $1& wait
    kill -ALRM $$
}

watchit $1& a=$!         #start the timeout
shift                    #first param was timeout for sleep
trap "cleanup" ALRM INT  #cleanup after timeout
"$@"& wait $!; RET=$?    #start the job wait for it and save its return value
kill -ALRM $a            #send ALRM signal to watchit
wait $a                  #wait for watchit to finish cleanup
exit $RET                #return the value
14
ответ дан 30 November 2019 в 17:17
поделиться

Следующий сценарий показывает, как сделать это использование фоновые задачи. Первый раздел уничтожает 60-секундный процесс после 10 вторых пределов. Вторые попытки уничтожить процесс из этого уже выходят. Следует иметь в виду, что при установке тайм-аута действительно высоко идентификаторы процесса могут перевернуться, и Вы уничтожите неправильный процесс, но это - больше теоретической проблемы - тайм-аут должен был бы быть очень большой, и необходимо будет запускать партия из процессов.

#!/usr/bin/bash

sleep 60 &
pid=$!
sleep 10
kill -9 $pid

sleep 3 &
pid=$!
sleep 10
kill -9 $pid

Вот вывод на моем поле Cygwin:

$ ./limit10
./limit10: line 9:  4492 Killed sleep 60
./limit10: line 11: kill: (4560) - No such process

, Если Вы хотите только ожидать, пока процесс не закончился, необходимо ввести цикл и проверку. Это немного менее точно с тех пор sleep 1, и другие команды на самом деле займут больше чем одну секунду (но не намного больше). Используйте этот сценарий для замены второго раздела выше (" echo $proc", и" date" команды для отладки, я не ожидал бы иметь их в конечном решении).

#!/usr/bin/bash

date
sleep 3 &
pid=$!
((lim = 10))
while [[ $lim -gt 0 ]] ; do
    sleep 1
    proc=$(ps -ef | awk -v pid=$pid '$2==pid{print}{}')
    echo $proc
    ((lim = lim - 1))
    if [[ -z "$proc" ]] ; then
            ((lim = -9))
    fi
done
date
if [[ $lim -gt -9 ]] ; then
    kill -9 $pid
fi
date

Это в основном циклы, проверяя, работает ли процесс все еще каждую секунду. В противном случае это выходит из цикла со специальным значением, чтобы не попытаться уничтожить ребенка. Иначе это приводит к таймауту и действительно уничтожает ребенка.

Вот вывод для sleep 3:

Mon Feb  9 11:10:37 WADT 2009
pax 4268 2476 con 11:10:37 /usr/bin/sleep
pax 4268 2476 con 11:10:37 /usr/bin/sleep
Mon Feb  9 11:10:41 WADT 2009
Mon Feb  9 11:10:41 WADT 2009

и sleep 60:

Mon Feb  9 11:11:51 WADT 2009
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
Mon Feb  9 11:12:03 WADT 2009
Mon Feb  9 11:12:03 WADT 2009
./limit10: line 20:  4176 Killed sleep 60
12
ответ дан 30 November 2019 в 17:17
поделиться

Выезд эта ссылка . Идея состоит просто в том, что Вы выполнили бы myscript.sh как подпроцесс Вашего сценария и записали бы его PID, затем уничтожили бы его, если он работает слишком долго.

5
ответ дан 30 November 2019 в 17:17
поделиться

Вы могли выполнить команду как фоновое задание (т.е. с "&";), используйте переменную удара для "pid последней выполненной команды", сон для необходимого количества времени, затем работайте kill с тем pid

2
ответ дан 30 November 2019 в 17:17
поделиться
Другие вопросы по тегам:

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