LINUX.ORG.RU

с̶а̶м̶о̶обновляющийся скрипт

 


1

1

есть скрипт (так скажем ядро), - запускается и в нем выполняется очень важный цикл, который нельзя ни в коем случае прерывать. но в этот скрипт я очень часто вношу изменения, поэтому вариант сохранить-выключить-включить не подходит. я уж собрался было вынести все в «модули», то есть что-то вроде:

 # загружаем модуль при запуске скрипта
source "raw.sh"

# при нажатии ^C модуль перезагружается
trap "source raw.sh" SIGINT

# цикл, который нельзя прерывать
# команда raw является функцией в модуле - в ней изменяемый код
while true; do raw ...; done

но такой финт не работает. может вы знаете другие способы вынести модифицируемый код в отдельное место, которое можно перезагружать и не останавливать выполнение основного скрипта?

можно конечно raw вообще сделать отдельным файлом и процессом, каждый раз просто перезапуская его, а не выполняя как функцию, но это будет чуть менее чем ресурсоемко (порождать новый процесс на каждый пук в цикле).

★★★★★

В bash - вряд ли. Используй LISP+REPL. Там можно будет на ходу функции править.

auto12884835 ()

Омг, а на нормальном ЯП осилить нельзя? Бери перл, питон — они везде есть. Bash — совсем не то, для твоих целей.

X10Dead ★★★★★ ()

вынести модифицируемый код в отдельное место,

И что тебе мешало догадаться?

-while true; do raw ...; done
+while true; do
+  source raw.sh
+  raw ...;
+done
router ★★★★★ ()
Последнее исправление: router (всего исправлений: 1)

Вообще-то, такой финт работает, но, наверное, не так, как тебе хотелось бы.
Во первых, по ^C SIGINT посылается не только основному скрипту, но и всей терминальной группе процессов, т.е. любая внешняя или выполняющаяся в subshell-е (в т.ч. в pipe) команда его получит и упадет.
Во вторых, пытаться переопределить функцию во время её работы - не очень хорошая мысль.
Возможный выход:

 NeedReset=0 ; trap 'NeedReset=1' CONT
и потом использовать не ^C, а 'killall -CONT ...' с другой консоли и
 while true ; do
    let NeedReset && { . raw.sh ; NeedReset=0 ; }
    raw
 done
соответственно.

ABW ★★★★ ()

Спасибо всем, решение нашлось.

Для тех, кому интересно: пишу IRC и XMPP бота на чистом баше.
И оставалось найти способ дописывать скрипты, чтобы бот не летал и не раздражал пользователей :)

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

Исходники-то покажешь? XMPP часть особенно интересует.

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

Заинтересовало. Если будут наработки кастани, плиз.

IPR ★★★★★ ()

riki, IPR, если не в терпеж, немного описал протокол - там все просто: http://habrahabr.ru/post/151464/

Сорцы конечно выложу, когда сделаю IRC одновременно с XMPP.

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

Спасибо, ждём релиза :) Как раз сам в свободное время собирался поковыряться с веб-джаббер-клиентом на баше.

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