|
|
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
Привет всем! Сразу дико извиняюсь за ламерский вопрос, но изобретать велосипед тоже не хочиццо. Задача у меня такая: нужно в фоне (по крону) запускать задание и принудительно завершать его в заданное время. В данном примере это закачка wget-ом. Уже есть работающее решение (не моё) — но оно основано на анализе вывода ps и выбора пидов процессов с заданными опциями запуска с последующим kill-ом данных пидов. В данном случае не подходит из-за зависимости от набора и порядка опций запуска (wget [option]) — может убивать другие закачки. Предполагаемое решение — запустить wget -b и сохранить его PID. Затем в заданное время (или через заданный интервал — он постоянен, как и время запуска) убить процесс по его пиду. Мне проще всего наваять это на Сях (рабочий язык, хоть в основном на Форточках). Всякие там форки и сигналы :-) Но есть ли решение проще (Перл не предлагать — не знаю его). Хочу оформить как скрипт на шелле (bash): Код: plaintext 1. 2. 3. 4. 5. 6. intervaldownloadslist.sh — это список закачек для wget-а. Скрипт запускается (вечером) из заранее выбранного каталога. Сначала запускается wget с нужными опциями (сайт, с которого скачивается, довольно "тугой"). PID запущенной в фоне качалки запоминается и следующей строкой запускается команда at для убивания качалки по полученному PID-у в нужное время (это следующее утро). Покритикуйте, пожалуйста, скрипт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 12:28:57 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
мне кажется через интервал было бы получше чтоб незапутаться в заданиях :) т.е. вместо at вписать Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 12:46:10 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
Спасибо за подсказку! Тогда будет: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2007, 12:59:51 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
Что-то не получается запомнить PID запущенного в фоне процесса в переменной! Вот эта строка: Код: plaintext 1. Переменная pid пустая! Как правильно это делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 13:02:28 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
если процесс запускается в фоне - то используйте $! Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 13:16:10 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
Использование $! в данном случае не помогает — эта переменная сохраняет PID процесса, запущенного с &, а wget здесь запускается с ключом фонового режима -b, без &. $! пустая. Запуск с дополнительным указанием & (и с -b) возвращает в $! НЕ PID запущенного wget-а. Как можно получить PID запущенного процесса (не в фоне, т.е. без &)? Проги с запуском в фоне с помощью собственных ключей запуска, без &, похоже, шеллом за фоновые не считаются. И как тут быть? Пока в ебуках ничего нужного не нашёл. Или всё-таки парсить вывод ps на предмет нахождения процесса с нужным именем и аргументами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 15:14:30 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
Вдогонку: если запустить wget -b из консоли, то $! содержит его PID, а если скрипт с этой строкой запуска из консоли, то $! пустая (в обоих случаях нигде нет &). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 15:29:23 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
а shell тот, что в скрипте и которым интерактивно пользуетесь - один и тот же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 15:41:06 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
так а полчему бы не запустить с & ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 15:44:50 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
В моём предыдущем посте ашипка вышла — при запуске в консоли PID из $! и PID, возвращённый wget-ом в текстовом сообщении на консоль - разные. Шелл один и тот же — bash 2.05b release 41.5.centos.0. Скорее всего узнать PID процесса, запущенного в фоне с помощью собственных ключей, а не с помощью шелловского &, стандартными средствами шелла невозможно. Процесс запускается, затем форкается, родитель завершается и запускает потомка (тот же исполняемый файл wget) как демона (подробно это описано у Стивенса). Именно PID этого демона wget выдаёт при запуске с ключом -b: авторРабота продолжается в фоновом режиме, pid 21516. Выходные данные будут записаны в `wget-log'. Единственно возможным способом вижу сохранить это сообщение и парсить его для извлечения номера процесса. Только чем — awk? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 15:54:40 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
можно сделать один трюк использоать exec. Можно конечно на C написать, но и возможнотей шелла хватит есть шельник Код: plaintext 1. 2. 3. т.е. Вы на stdout выдаете текущий pid, а затем процесс с этим pid-ом замещаете новой программой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 16:00:20 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
Если wget сам выдает pid -можно и пропарсить Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 16:04:36 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
Насчёт запуска с & я уже ответил выше — при этом возвращается другой PID — не самого рабочего процесса-качалки, а его запускача (в случае с запуском с ключом -b). Без него — именно тот PID, но — wget в таком случае считает, что запущен интерактивно, и не пишет лог. А мне лог нужен для контроля скачки. Так что не пойдёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 16:10:18 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
2 --null-- Спасибо, пример с парсингом седом и ауком помог. Окончательный вид скрипта: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Однако, для прог, которые сами себя могут запускать в фоне (в виде демона), выдрать PID рабочего процесса не так-то просто :-((( Хорошо ещё, что wget (а не шелл) выдаёт нужный PID в составе строки сообщения, и его только надо выудить из неё. Хуже для тех прог, что запустятся в таком случае "молча". А вот запуск через exec вряд ли поможет. Он запустит с известным PID-ом не сам рабочий процесс, а его запускач (как я уже указывал выше, у Стивенса в Разработке сетевых приложений том 1 глава 12 процесс запуска программы-демона подробно описан). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 16:37:22 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
я все время забываю, что у Вас не прога сама запускается, а промежуточнывй процесс Естественно, о процессе осведомлен только прямой родитель. И в нем и надо все это реализовывать. А если это не непосредственный потомок -то тогда надо извращаться. Для shell и в Linux я бы предложил запустить pstree -p $$ и пропарсить вывод -там будет дерево наших потомков с именем программы и pid-ом. Универсально -анализировать ps. Но лучше всего все реализовать в "пускаче". Или нет доступа к его исходникам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 16:43:06 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
2 --null-- Спасибо, пример с парсингом седом и ауком помог. Окончательный вид скрипта: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Однако, для прог, которые сами себя могут запускать в фоне (в виде демона), выдрать PID рабочего процесса не так-то просто :-((( Хорошо ещё, что wget (а не шелл) выдаёт нужный PID в составе строки сообщения, и его только надо выудить из неё. Хуже для тех прог, что запустятся в таком случае "молча". А вот запуск через exec вряд ли поможет. Он запустит с известным PID-ом не сам рабочий процесс, а его запускач (как я уже указывал выше, у Стивенса в Разработке сетевых приложений том 1 глава 12 процесс запуска программы-демона подробно описан). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 16:51:37 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
Доступ к исходникам wget у меня есть :-) Но править для каждой новой версии... А вот парсинг вывода ps давно уже применяю (не я его писал). Хотел попроще — но получилось тоже с парсингом, хотя и сразу в одном скрипте. Ещё раз спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 17:42:18 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
а блин, это ж wget запускает. и то верно. Вопрос снимается :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2007, 17:45:57 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
можно еще так сделать Код: plaintext 1. если нужно запускать несколько wget-ов одновременно, то файл вывода можно задавать в опциях ( wget -b -o logfile ...) Ну а если скрипт закачки один, где последовательно перебираются url ( как в данном случае ), и мы не боимся зацепить чужое, то еще 2-ой вариант: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 08:51:59 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
Спасибо всем откликнувшимся. Проверил на закачке, запускаемой из крона на ночь. Убило процесс вовремя. Использовал вариант с парсингом вывода wget-а при запуске седом и ауком. Такой вариант предпочтительнее, т.к. убивает только конкретный процесс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 10:42:50 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
в принципе можно было одним авком. Сразу поленился, видать. Все меньше процессов будет Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 10:59:21 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
--null--в принципе можно было одним авком. Сразу поленился, видать. Все меньше процессов будет Код: plaintext Ну у вас и извраты. Вам правильно сказали - убивайте уж через fuser. Ну или непонятно, на фига там какие то запускачи понадобились - это признак кривости дизайна обычно. Ну или запускайте из скрипта не в фоне, и убивайте скрипт (он тогда и дитя прибъет). Или убивайте по группе процессов. Вариантов море, вариант с авком самый идиотский. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 23:35:51 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
И еще - а нужен ли вам ключик -b? Почему не wget что то там > log 2>& 1 < /dev/null & pid=$! ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 23:38:41 |
|
||
|
Как заставить прогу работать в заданном интервале времени (в фоне)?
|
|||
|---|---|---|---|
|
#18+
Сначала насчёт запускачей и кривости дизайна. Запускач реализован в самом wget — качалка запускается как демон (ключ -b). Как я выше заметил, у Стивенса описывается, как это сделать. Описаний других способов я пока не встречал. Для уверенности следовало бы мне глянуть сорцы, да времени нет :-((( Претензии насчёт кривости к авторам wget-а и самих Никсов :-) Запуск из скрипта должен быть именно в фоне — скрипт сам запускается кроном, и ключ -b заставляет писать лог, который мне нужен для контроля чего скачалось. Если запустить не в фоне и перенаправить, то я представляю, чего там напишет — мне такой вывод неудобен. Короче, я остановился на двух вариантах с парсингом — первый с седом и ауком я уже испробовал, работает, второй только с ауком сегодня тоже попробую. Только не надо эмоциональных эпитетов при оценке вариантов — исчо один холивар нихачу :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 11:21:34 |
|
||
|
|

start [/forum/topic.php?fid=25&msg=34418123&tid=1488317]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 345ms |

| 0 / 0 |
