Команда Bash Run на определенное время?

12

Я делаю сценарий Bash для моего использования. Как я могу запустить команду в течение определенного времени, например, 20 секунд и завершить команду? Я пробовал много решений, но ничего не работает, я также пробовал команду тайм-аута безуспешно. Пожалуйста, дайте мне какое-то решение для этого.

например: я хочу запустить эту команду в скрипте и терминале через 10 секунд

some command
Умайр Риаз
источник

Ответы:

14

Хм, это должно сработать

xmessage "Hello World" &
pidsave=$!
sleep 10; kill $pidsave

xmessageздесь приведен быстрый тестовый пример (в вашем случае команда airodump должна идти туда); &ставит это на задний план.

$!содержит PID последнего запущенного процесса (см., например, /programming//a/1822042/2037712 ); PID сохраняется в переменной pidsave.

После некоторого ожидания ( sleep) отправьте TERMсигнал процессу.

МРУ
источник
Спасибо дружище, это работает, но теперь у меня есть 1 проблема. Я хочу увидеть вывод, который создается командой, но окна xmessage ничего не показывают.
Umair Riaz
@UmairRiaz: xmessage был просто примером. Чтобы адаптировать свой пример в вопросе и записать вывод команды, используйте some command > logfile &в первой строке. После этого вы можете анализировать logfile.
13
4

Из командной строки Bash вы можете использовать "

  • your_command & sleep 20; kill $!
  • Или используйте команду timeout: например, aptget install timeoutиtimeout -k 3m 14s your_command
  • Или используйте, expectкак описано здесь: /unix/43340/how-to-introduce-timeout-for-shell-scripting
  • или сделайте это с помощью Perl: perl -e "alarm 10; exec @ARGV" "Your_command"
  • Или используйте это более загадочное решение: $COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID( Источник и объяснение )
Hennes
источник
1

Другой способ - использовать pgrep $ pattern или pkill $ pattern; возвращает все PID, соответствующие данному шаблону, просматривая все запущенные процессы на машине. Поэтому, чтобы ограничить область действия PID только теми, которые у вас есть, используйте: pgrep -P $ mypid $ pattern или pkill -P $ mypid $ pattern

Таким образом, чтобы запустить фоновый процесс в течение заданного промежутка времени, ваш скрипт будет выглядеть примерно так:

#!/bin/bash 
mypid=$$
run_something &
sleep $time_in_seconds
pkill -P $mypid something

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

Павел
источник
0

Вы можете использовать будильник командной строки, как Ebay-Alarm

Установите скрипт будильника и сделайте

ebay-alarm 10 sec -c some command &

маринара
источник