LINUX.ORG.RU

Номер Pid


0

1

В скрипте echo «wget http://yandex.ru" | at 16:50

Допустим через 5 часов после 16:50 как он запустится, мне нужно убить процесс. Пока я нашел единственное решение Это сразу же после добавить kill | at 21:50

Но как мне узнать какой именно будет pid номер этого процесса? Возможно ли создавать pid'ы с заданным номером?


Если не получается при помощи pidof, то парсь ps aux

Примерно так:

ps aux | grep имя_твоего_скрипта | grep -v grep | awk '{print $2}'

Shtsh ★★★★
()

Если wget единственный, можно pkill/killall использовать. Если нет - погрепать вывод ps на предмет яндекса. Но проще, конечно, PID в отдельный файлик закинуть.

Eddy_Em ☆☆☆☆☆
()

Эхай pid при старте вгета куда нибудь в /var/run, да и это всё лучше оформить в скрипт.

yoghurt ★★★★★
()
Ответ на: комментарий от drakmail

Нет нужно именно что бы вгет стартовал по расписанию.

tits
() автор топика
Ответ на: комментарий от Eddy_Em

Нет не единственный их может быть много и в разное время. и если я буду использовать kilall то может убить все вгеты причем те которые еще не закончились по времени. тоесть будут убиты раньше времени

tits
() автор топика
Ответ на: комментарий от Shtsh

ок а если у меня в 10.00 запустился wget http://yandex.ru потом в 10.30 запустился wget http://yandex.ru потом в 10.35 запустился wget http://yandex.ru и всех нужно убить в разное время. и имеют они одинаковый адрес http://yandex.ru

как мне их различать?

tits
() автор топика
Ответ на: комментарий от tits
  • Ты уверен, что это тебе действительно нужно предусматривать? Не проще ли позволить выполняться только одной копии скрипта?
  • Распиши подробно, чего хочешь добиться этим скриптом
Shtsh ★★★★
()
Ответ на: комментарий от Shtsh

Скрипт добавляет в задачи wget http://yandex.ru - адресс неизменный один и тот же всегда. Различно только время добавления. Тоесть 1. echo «wget http://yandex.ru" | at 10:50 -завершение через 1 час 2. echo „wget http://yandex.ru" | at 10:52 - завершение через 30 минут 3. echo „wget http://yandex.ru" | at 10:58 - завершение через 5 минут 4. echo „wget http://yandex.ru" | at 11:00 - завершение через 3 часа 5. echo „wget http://yandex.ru" | at 11:15 - завершение через 1 час. Завершение то есть:

kill PID 1 | at 11:50 kill PID 2 | at 11:22 kill PID 3 | at 11:03 kill PID 4 | at 14:00 kill PID 5 | at 12:15

Причем время у меня берется из переменных, которое задается пользователем. То есть оно всегда задаваемое и всегда разное выполнения вгета и его завершения.

Вот я не могу сейчас реализовать его завершение так как не знаю какой номер PID будет допустим здесь: 4. echo „wget http://yandex.ru" | at 11:00 - завершение через 3 часа. ЧТо бы его завершить. kill PID 4 | at 14:00

tits
() автор топика
Ответ на: комментарий от Eddy_Em

Вот это интересно, то есть при добавление wget в задачу можно ему одновременно указать PID номер? Где об этом подробней почитать?

tits
() автор топика
Ответ на: комментарий от tits

В скрипте можно получить PID последнего запущенного процесса; этот PID внутри этого же скрипта может быть сохранен в какой-то отдельный файл для использования другими процессами/скриптами.

Почитать можно в man bash.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

$! это я знаю, но у скрипт добавляет только задачу. Например сейчас 12:21 и он добавил задачу в at которая выполнится в 14:50 а через 2 минуты создатся еще задача на 13:10 Так что $! здесь не прокатывает

tits
() автор топика
Ответ на: комментарий от tits

Это в самом первом комментарии предлагали сделать :)

Eddy_Em ☆☆☆☆☆
()

Выносить PID контролируемого процесса за пределы выполняемого задания ни к какому решению не приведёт — придётся идентифицировать если не сам PID, то файл, в котором он сохранён. Или останавливать процессы, не имеющие к заданию никакого отношения.

Проще и правильней всего запускать контролируемый процесс в скрипте-обёртке, который сам остановит контролируемый процесс, когда потребуется:

#!/bin/bash
wget ftp://mirror.yandex.ru &
PID=$!
sleep 6h
kill -9 $PID
blexey ★★★★★
()

Если известен файл, в который пишет этот мм...это скрипт, то можно убить через

fuser -k file

zolden ★★★★★
()
Ответ на: комментарий от tits

А что делать, если уже есть процесс с таким PID'ом?

А вообще, ничего невозможного нет: исходники ядра в руки - и вперед!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от unC0Rr

Вот «двуглавый» вариант, который исключает данный косяк:

#!/bin/bash
case "$1" in
  watch)
    sleep 5h
    kill -9 $2 $3
    ;;
  *)
    wget ftp://mirror.yandex.ru &
    PID=$!
    $0 watch $PID $$ &
    PIDW=$!
    wait $PID
    kill -9 $PIDW
esac
Запускается без параметров и сам стартует свой второй экземпляр с параметром watch, ожидающий указанное время.

Каждый экземпляр, в зависимости от того, кто из них завершится раньше, убивает оба запущенных экземпляра, предотвращая выполнение финального kill другого.

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

blexey ★★★★★
()
Ответ на: комментарий от tits

Почему нельзя процессу назначать свой PID? это было бы очень удобно.

man слон-живописец

Вот, до чего доводит людей одномерное, последовательное мышление — они сдаются перед простой задачкой, все средства для решения которой у них под рукой и выдумывают химер вместо решений, элементарных с точки зрения параллельного программирования.

blexey ★★★★★
()
ps -o pid,lstart= -C wget

тут будет виден PID и во сколько процесс стартовал.
Ну ты понел, да

zolden ★★★★★
()
Ответ на: комментарий от baverman

Ты победил :) Всё уже укранаписано до нас.

blexey ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.