2

У меня есть скрипт, который запускает Firefox на 4 секунды, а затем убивает его. Firefox автоматически войдет в плененный портал, поэтому мне нужно, чтобы он был открыт только в течение 4 секунд, как только Wi-Fi подключится. Я на Ubuntu 13.04.

Кажется, моя проблема в том, что $ pid не установлен.

firefox ; pid=$!
sleep 4
kill $pid

РЕДАКТИРОВАТЬ: удален набор, и теперь он дает убить неверный PID.

5 ответов5

7

Ваш скрипт не работает, потому что он ждет, пока процесс firefox не завершится, а затем выполняет pid=$!и другая команда.

Простой способ сделать то, что вы хотите, это timeout:

timeout 4s firefox

Он запускает программу, указанную после первого аргумента, и останавливает ее через время, указанное в качестве первого аргумента.

1

Причина вашего pid=$! не в том, что $! PID последнего задания, запущенного в фоновом режиме.

То есть,

$ foo & echo $!

запустит foo и отобразит PID своего процесса.

В вашем случае firefox ; pid=$! нужно заменить на firefox & pid=$! но это может быть довольно бесполезно, потому что firefox - это скрипт, который exec реальный двоичный файл.

Вам нужно либо использовать killall (который попытается уничтожить все экземпляры firefox, будь то у вас или у других пользователей), либо (скопировать и) отредактировать скрипт /usr/bin/firefox для отображения нового PID.

0

Еще несколько решений.

-1

Следуя нескольким подсказкам из других ответов, я придумал этот грязный скрипт:

firefox -no-remote -p c-portal &
ffpid=`ps aux | grep firefox | sed '2q;d' | tr -s ' ' | cut -d ' ' -f 2`
echo "firefox pid: $ffpid"
sleep 4
kill $ffpid

Мне также нужно было перейти к:config и изменить browser.sessionstore.resume_from_crash на false.

Объяснение каждой команды: ps aux получает полный список процессов в системе, grep находит все те, которые содержат firefox, sed получает вторую строку (которая, как представляется, всегда является последним экземпляром firefox), tr удаляет лишние пробелы, вырезает получает второй столбец (-d означает разделитель, который является пробелом).

После этого беспорядка обработки строки, есть отладочная вещь, которая печатает PID firefox, спит 4 секунды, чтобы он мог войти в систему, а затем убить firefox. Параметр about:config не позволяет восстановить сеанс.

-2

Я не уверен, подходит ли это вашей ситуации, но вы можете использовать killall вместо kill . Так было бы:

firefox
sleep 4
killall firefox

Я думаю, что более правильный подход - получить последний процесс firefox с помощью ps aux | grep firefox , но сегодня я не знаю, как сделать так, чтобы с помощью bash-скрипта возвращался только самый большой номер процесса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .