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