powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Как заставить прогу работать в заданном интервале времени (в фоне)?
24 сообщений из 24, страница 1 из 1
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34415193
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
Сразу дико извиняюсь за ламерский вопрос, но изобретать велосипед тоже не хочиццо.
Задача у меня такая: нужно в фоне (по крону) запускать задание и принудительно завершать его в заданное время. В данном примере это закачка wget-ом. Уже есть работающее решение (не моё) — но оно основано на анализе вывода ps и выбора пидов процессов с заданными опциями запуска с последующим kill-ом данных пидов. В данном случае не подходит из-за зависимости от набора и порядка опций запуска (wget [option]) — может убивать другие закачки.
Предполагаемое решение — запустить wget -b и сохранить его PID. Затем в заданное время (или через заданный интервал — он постоянен, как и время запуска) убить процесс по его пиду.
Мне проще всего наваять это на Сях (рабочий язык, хоть в основном на Форточках). Всякие там форки и сигналы :-) Но есть ли решение проще (Перл не предлагать — не знаю его).
Хочу оформить как скрипт на шелле (bash):
Код: plaintext
1.
2.
3.
4.
5.
6.
#!/bin/sh

pid=`wget -b -c -nd --proxy=off --cache=off -i intervaldownloadslist.sh --timeout=2400 --retry-connrefused --tries=0`
at  8 : 30  kill ${pid}

exit  0 

intervaldownloadslist.sh — это список закачек для wget-а.
Скрипт запускается (вечером) из заранее выбранного каталога. Сначала запускается wget с нужными опциями (сайт, с которого скачивается, довольно "тугой"). PID запущенной в фоне качалки запоминается и следующей строкой запускается команда at для убивания качалки по полученному PID-у в нужное время (это следующее утро).
Покритикуйте, пожалуйста, скрипт.
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34415243
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне кажется через интервал было бы получше чтоб незапутаться в заданиях :)
т.е. вместо at
вписать
Код: plaintext
1.
2.
3.
...
sleep интервал
kill $pid
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34415324
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за подсказку!
Тогда будет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#!/bin/sh

pid=`wget -b -c -nd --proxy=off --cache=off -i intervaldownloadslist.sh --timeout=2400 --retry-connrefused --tries=0`
sleep 14h
kill $pid

exit  0 
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34418067
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не получается запомнить PID запущенного в фоне процесса в переменной!
Вот эта строка:
Код: plaintext
1.
pid=`wget -b -c -nd --proxy=off --cache=off -i intervaldownloadslist.sh --timeout=2400 --retry-connrefused --tries=0 --limit-rate=1k`

Переменная pid пустая!
Как правильно это делать?
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34418123
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если процесс запускается в фоне - то используйте $!

Код: plaintext
1.
wget -b -c -nd --proxy=off --cache=off -i intervaldownloadslist.sh --timeout=2400 --retry-connrefused --tries=0 &
pid=$!
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34418659
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование $! в данном случае не помогает — эта переменная сохраняет PID процесса, запущенного с &, а wget здесь запускается с ключом фонового режима -b, без &. $! пустая.
Запуск с дополнительным указанием & (и с -b) возвращает в $! НЕ PID запущенного wget-а.
Как можно получить PID запущенного процесса (не в фоне, т.е. без &)?
Проги с запуском в фоне с помощью собственных ключей запуска, без &, похоже, шеллом за фоновые не считаются. И как тут быть? Пока в ебуках ничего нужного не нашёл.
Или всё-таки парсить вывод ps на предмет нахождения процесса с нужным именем и аргументами?
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34418724
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку: если запустить wget -b из консоли, то $! содержит его PID, а если скрипт с этой строкой запуска из консоли, то $! пустая (в обоих случаях нигде нет &).
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34418774
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а shell тот, что в скрипте и которым интерактивно пользуетесь - один и тот же?
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34418796
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так а полчему бы не запустить с &
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34418835
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моём предыдущем посте ашипка вышла — при запуске в консоли PID из $! и PID, возвращённый wget-ом в текстовом сообщении на консоль - разные.
Шелл один и тот же — bash 2.05b release 41.5.centos.0.
Скорее всего узнать PID процесса, запущенного в фоне с помощью собственных ключей, а не с помощью шелловского &, стандартными средствами шелла невозможно. Процесс запускается, затем форкается, родитель завершается и запускает потомка (тот же исполняемый файл wget) как демона (подробно это описано у Стивенса). Именно PID этого демона wget выдаёт при запуске с ключом -b:
авторРабота продолжается в фоновом режиме, pid 21516.
Выходные данные будут записаны в `wget-log'.
Единственно возможным способом вижу сохранить это сообщение и парсить его для извлечения номера процесса. Только чем — awk?
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34418854
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно сделать один трюк
использоать exec. Можно конечно на C написать, но и возможнотей шелла хватит

есть шельник
Код: plaintext
1.
2.
3.
#!/bin/sh
echo $$
exec ./program

т.е. Вы на stdout выдаете текущий pid, а затем процесс с этим pid-ом замещаете новой программой.
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34418873
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если wget сам выдает pid -можно и пропарсить

Код: plaintext
wget /www.rr.rr/ff -b | sed -n -e "1p" | sed "s/\.$//" | awk '{print $NF}'
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34418902
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчёт запуска с & я уже ответил выше — при этом возвращается другой PID — не самого рабочего процесса-качалки, а его запускача (в случае с запуском с ключом -b). Без него — именно тот PID, но — wget в таком случае считает, что запущен интерактивно, и не пишет лог. А мне лог нужен для контроля скачки. Так что не пойдёт.
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34419019
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 --null--
Спасибо, пример с парсингом седом и ауком помог.
Окончательный вид скрипта:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#!/bin/sh

pid=`wget -b -c -nd --proxy=off --cache=off -i intervaldownloadslist.sh --timeout=2400 --retry-connrefused --tries=0 | sed -n -e "1p" | sed "s/\.$//" | awk '{print $NF}'`
sleep 14h
kill $pid

exit  0 
Ночью попробую.
Однако, для прог, которые сами себя могут запускать в фоне (в виде демона), выдрать PID рабочего процесса не так-то просто :-(((
Хорошо ещё, что wget (а не шелл) выдаёт нужный PID в составе строки сообщения, и его только надо выудить из неё. Хуже для тех прог, что запустятся в таком случае "молча".
А вот запуск через exec вряд ли поможет. Он запустит с известным PID-ом не сам рабочий процесс, а его запускач (как я уже указывал выше, у Стивенса в Разработке сетевых приложений том 1 глава 12 процесс запуска программы-демона подробно описан).
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34419046
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я все время забываю, что у Вас не прога сама запускается, а промежуточнывй процесс
Естественно, о процессе осведомлен только прямой родитель. И в нем и надо все это реализовывать.
А если это не непосредственный потомок -то тогда надо извращаться.
Для shell и в Linux я бы предложил запустить pstree -p $$ и пропарсить вывод -там будет дерево наших потомков с именем программы и pid-ом.
Универсально -анализировать ps.
Но лучше всего все реализовать в "пускаче". Или нет доступа к его исходникам?
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34419079
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 --null--
Спасибо, пример с парсингом седом и ауком помог.
Окончательный вид скрипта:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#!/bin/sh

pid=`wget -b -c -nd --proxy=off --cache=off -i intervaldownloadslist.sh --timeout=2400 --retry-connrefused --tries=0 | sed -n -e "1p" | sed "s/\.$//" | awk '{print $NF}'`
sleep 14h
kill $pid

exit  0 
Ночью попробую.
Однако, для прог, которые сами себя могут запускать в фоне (в виде демона), выдрать PID рабочего процесса не так-то просто :-(((
Хорошо ещё, что wget (а не шелл) выдаёт нужный PID в составе строки сообщения, и его только надо выудить из неё. Хуже для тех прог, что запустятся в таком случае "молча".
А вот запуск через exec вряд ли поможет. Он запустит с известным PID-ом не сам рабочий процесс, а его запускач (как я уже указывал выше, у Стивенса в Разработке сетевых приложений том 1 глава 12 процесс запуска программы-демона подробно описан).
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34419278
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доступ к исходникам wget у меня есть :-) Но править для каждой новой версии...
А вот парсинг вывода ps давно уже применяю (не я его писал). Хотел попроще — но получилось тоже с парсингом, хотя и сразу в одном скрипте.
Ещё раз спасибо за помощь.
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34419294
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а блин, это ж wget запускает. и то верно. Вопрос снимается :-)
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34420221
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно еще так сделать
Код: plaintext
1.
fuser -k wget-log
убъет все процессы связанные с файлом wget-log
если нужно запускать несколько wget-ов одновременно, то файл вывода можно задавать в опциях ( wget -b -o logfile ...)
Ну а если скрипт закачки один, где последовательно перебираются url ( как в данном случае ), и мы не боимся зацепить чужое, то еще 2-ой вариант:
Код: plaintext
1.
kill `pidof wget`  2 >/dev/null
зарубит все wget-ы вообще
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34420570
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем откликнувшимся.
Проверил на закачке, запускаемой из крона на ночь. Убило процесс вовремя.
Использовал вариант с парсингом вывода wget-а при запуске седом и ауком. Такой вариант предпочтительнее, т.к. убивает только конкретный процесс.
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34420656
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в принципе можно было одним авком. Сразу поленился, видать. Все меньше процессов будет

Код: plaintext
wget /www.rr.rr/ff -b | awk '{z= sub("\\.$","",$NF);print $NF;exit}'
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34423200
Alex Roudnev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--в принципе можно было одним авком. Сразу поленился, видать. Все меньше процессов будет

Код: plaintext
wget /www.rr.rr/ff -b | awk '{z= sub("\\.$","",$NF);print $NF;exit}'


Ну у вас и извраты.

Вам правильно сказали - убивайте уж через fuser. Ну или непонятно, на фига там какие то запускачи понадобились - это признак кривости дизайна обычно. Ну или запускайте из скрипта не в фоне, и убивайте скрипт (он тогда и дитя прибъет). Или убивайте по группе процессов. Вариантов море, вариант с авком самый идиотский.
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34423203
Alex Roudnev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще - а нужен ли вам ключик -b?

Почему не

wget что то там > log 2>& 1 < /dev/null &

pid=$!

??
...
Рейтинг: 0 / 0
Как заставить прогу работать в заданном интервале времени (в фоне)?
    #34423890
Frame Relay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала насчёт запускачей и кривости дизайна. Запускач реализован в самом wget — качалка запускается как демон (ключ -b). Как я выше заметил, у Стивенса описывается, как это сделать. Описаний других способов я пока не встречал. Для уверенности следовало бы мне глянуть сорцы, да времени нет :-((( Претензии насчёт кривости к авторам wget-а и самих Никсов :-)
Запуск из скрипта должен быть именно в фоне — скрипт сам запускается кроном, и ключ -b заставляет писать лог, который мне нужен для контроля чего скачалось. Если запустить не в фоне и перенаправить, то я представляю, чего там напишет — мне такой вывод неудобен.
Короче, я остановился на двух вариантах с парсингом — первый с седом и ауком я уже испробовал, работает, второй только с ауком сегодня тоже попробую.
Только не надо эмоциональных эпитетов при оценке вариантов — исчо один холивар нихачу :-)))
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Как заставить прогу работать в заданном интервале времени (в фоне)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]