StackOverflow не позволит мне удалить мой ответ, так как он принят. Он набирает отрицательные голоса, поскольку находится в верхней части списка, а под ним - лучшее решение. Если вы работаете в системе GNU, пожалуйста, используйте timeout
вместо того, чтобы предлагать @wRAR. Итак, в надежде, что вы прекратите понижающее голосование, вот как это работает:
timeout 1s ./myProgram
Вы можете использовать s
, m
, h
или d
для секунд (по умолчанию, если не указано), минут, часов или дней. Отличная особенность заключается в том, что вы можете указать другую опцию -k 30s
(до 1s
выше), чтобы убить ее с помощью SIGKILL через еще 30 секунд, если он не отвечает на исходный SIGTERM.
Очень полезный инструмент. Теперь прокрутите вниз и проголосуйте за ответ @ wRAR.
Для потомков это было мое оригинальное - низшее - предложение, оно все еще может быть, если кому-то пригодится.
Простой bash-скрипт должен сделать это за вас
./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn't finish"
Это должно сделать это.
$!
расширяется до последнего фонового процесса (с помощью &
), и kill возвращает false, если он не уничтожил какой-либо процесс, поэтому эхо выполняется только в том случае, если оно действительно что-то убило.
2>/dev/null
перенаправляет kill stderr, в противном случае он напечатает что-то, сообщающее, что он не смог убить процесс.
Возможно, вы захотите добавить -KILL
или любой другой сигнал, который хотите использовать, чтобы избавиться и от процесса.
EDIT
Как заметил Эфимент, здесь гонка, если ваша программа завершится, а какой-то другой процесс заберет pid, вместо этого он будет убит. Чтобы уменьшить вероятность этого, вы можете реагировать на SIGCHLD и не пытаться убить его, если это произойдет. Еще есть шанс убить неправильный процесс, но он очень далек.
trapped=""
trap 'trapped=yes' SIGCHLD
./myProgram &
sleep 1
[ -z "$trapped" ] && kill $! 2>/dev/null && echo '...'