LINUX.ORG.RU

bash полностью форкнуть процесс, без родителя

 


0

1

Как можно полностью форкнуть нечто..?


cat ./my.sh

#!/bin/bash
if [ "$2" = "started" ] ; then
  exec sleep 15 ; virsh dumpxml $1 > /tmp/$1.xml
  exit 0
else
  exit 0
fi

Суть задачи такова: «virsh dumpxml $1 > /tmp/$1.xml» --- команда должна быть выполнена, только после завершения my.sh. Как этого достичь..? Да ещё и желательно без применения sleep. А чтобы, my.sh завершился, и «virsh dumpxml $1 > /tmp/$1.xml» выполнилась.

Спасибо!

★★★★★

Суть задачи такова: «virsh dumpxml $1 > /tmp/$1.xml» --- команда должна быть выполнена, только после завершения my.sh. Как этого достичь..?

Если понимать тебя буквально, то надо просто поставить вызов virsh последним в my.sh

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

Если понимать меня буквально, то из-за недописанного libvirt, приходится извращаться.

И мне надо выполнить dumpxml стартуемой машины, в qemu хуке. Только вот нюанс заключается в том, что пока выполняется хук: qemu, я не могу делать dumpxml этой же машины... - Проблема курицы и яйца.

DALDON ★★★★★
() автор топика
Последнее исправление: DALDON (всего исправлений: 1)
Ответ на: комментарий от DALDON

Если понимать меня буквально, то из-за недописанного libvirt, приходится извращаться.

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

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

Суть вопроса проста:

Есть kvm1 и kvm2 узлы (kvm+libvirt). Без общего хранилища.

В случае полного и не обратимого выхода из строя узла kvm1, я должен развернуться на узле: kvm2.

Образы инкрементно с kvm1 на kvm2 я перекидываю через zfs - тут всё ок. (Я знаю, что инкрементно пересылать образы, уже умеет libvirt, но всё же zfs более подходит).

Вопрос, теперь в том, как рассказать libvirt демону на узле kvm2, какие у него есть вирт. машины?

Копировать файлы конфигурации машин libvirt с узла: kvm1 на kvm2 - плохой путь, об этом в документации написано, и написано почему.

Делать миграцию машин с одного узла на другой - идея хорошая, но проблема в том, что libvirt не может её проводить, если у машин имеются снепшоты сделанные через libvirt. Это его недоработка. (пруф могу привести)

Решил при запуске машины написать сценарий который будет делать dumpxml, машины, + описание снепшотов, и отсылать на хост kvm1. Чтобы руками не сопровождать всё это хозяйство.

Но тоже не выходит, так-как пока выполняется хук qemu, не возможно сделать dump машины, которая собственно вызов хука и породила.

Как-то так. Буду рад идеям.

DALDON ★★★★★
() автор топика
Последнее исправление: DALDON (всего исправлений: 1)

Какой-то поток мыслей. Тебе надо чтоб дамп снимался после или чтоб файл появлялся после? Во втором случае - пиши во временное место\пайп, в первом - бредятина «снимать дамп только после того как этот дамп будет снят».

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

Тупо сделай FIFO и жди чтения из него (в скрипте «который будет делать dumpxml, машины, + описание снепшотов, и отсылать на хост kvm1»); по окончанию скрипта-хука запиши в этот FIFO что-нибудь.

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

Мне надо снимать xmlдамп после старта вирт. машинки. Всё. Вопрос собственно, как это сделать, имея хук, который во время своего исполнения не позволяет снимать xmlдамп машинки.

DALDON ★★★★★
() автор топика
Последнее исправление: DALDON (всего исправлений: 1)
Ответ на: комментарий от DALDON

master.sh

#!/bin/sh

mkfifo hook-exit
./hook.sh &

# здесь race, так что, если hook.sh очень быстрый, для надежности можно поставить в начало sleep

read <hook-exit r
echo Hook said: $r
rm hook-exit

hook.sh

#!/bin/sh

echo Hook is running...
sleep 5
echo Done >hook-exit
echo Hook exits 

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

Моя проблема ещё в том, что мне в мой: скрипт «который будет делать dumpxml, машины, + описание снепшотов, и отсылать на хост kvm1», надо как-то ещё передать имя вирт. машины. По окончанию хука, в FIFO и надо бы писать имя машины. Но мне не очень нравится идея, что мне надо постоянно чего-то ждать/читать... Таким макаром, мне может проще написать upstart сценарий, который будет ждать сообщения в шину.

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

Но мне не очень нравится идея, что мне надо постоянно чего-то ждать/читать...

Хочешь дождаться завершения процесса без ожидания? Ну, если получится, запости решение.

tailgunner ★★★★★
()

лови EXIT, и в нем запускай, что там тебе нужно

#! /bin/bash

function atexit () {
    echo "run last"
}
trap atexit EXIT

echo "end of script"
ananas ★★★★★
()
Ответ на: комментарий от ananas

Ого! Выглядит очень здорово... Похоже ты мне очень помог! Но есть вопрос.

Как мне, в функцию atexit, передать: $1

#!/bin/bash
if [ "$2" = "started" ] ; then
   echo $1
   function atexit () {
    echo $1 > /tmp/lor.xml                     
   }
trap atexit EXIT
else
  exit 0
fi
root@kvm1:~# less /tmp/lor.xml 
root@kvm1:~# 
DALDON ★★★★★
() автор топика
Ответ на: комментарий от ananas

Вот так уже не работает:

#!/bin/bash
if [ "$2" = "started" ] ; then
   mname=$(echo $1)
   function atexit () {
    virsh dumpxml "$mname" > /tmp/lor.xml      
   }
trap atexit EXIT
else
  exit 0
fi

А вот так работает:

#!/bin/bash
if [ "$2" = "started" ] ; then
   mname=$(echo $1)
   function atexit () {
    echo "$mname" > /tmp/lor.xml               
   }
trap atexit EXIT
else
  exit 0
fi

То есть, пока выполняется хук, я не могу сделать virsh dumpxml, на машину. К сожалению, trap, всё же держит ещё хук в исполнении...

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

Это я уже пробовал первым делом... К сожалению, не выходит...


#!/bin/bash
if [ "$2" = "started" ] ; then
   (setsid sleep 5;virsh dumpxml "$1" > /tmp/lor.xml &)
else
  exit 0
fi

У меня машина стартует 5 секунд. Что явно говорит, о том, что хук, какого-то хрену ждёт выхода того, что у меня выполняет setsid!

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

циклы для лохов. правильные пацаны inotifywatch используют

Бгг.

tailgunner ★★★★★
()
Ответ на: комментарий от DALDON
#!/bin/bash
if [ "$2" = "started" ] ; then
   setsid sleep 5 &
else
  exit 0
fi

Ждёт 5 сек, и запускает машину.

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

хук у тебя ждет завершения сабшела, в котором у тебя sleep 5 зачем-то торчит. вынеси амперсанд за скобки - будет тебе счастье

ananas ★★★★★
()
Ответ на: комментарий от ananas
#!/bin/bash
if [ "$2" = "started" ] ; then
   setsid sleep 5 &
else
  exit 0
fi

sleep, для понимания того, ждёт он завершения сабшелла или нет. Вот скотина ждёт! Мне то надобно чтобы не ждал..!

DALDON ★★★★★
() автор топика
Последнее исправление: DALDON (всего исправлений: 1)
Ответ на: комментарий от ananas

Хук не завершается, dump не выполняется...:

#!/bin/bash
if [ "$2" = "started" ] ; then
   mname=$(echo $1)
   function atexit () {
    (virsh dumpxml "$mname" > /tmp/lor.xml) &
   }
trap atexit EXIT
else
  exit 0
fi
DALDON ★★★★★
() автор топика
Ответ на: комментарий от DALDON

Хук не завершается

почему ты так решил? обложи свой вирш отладочными эхами, и глянь, как и когда они выполнятся

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

Всё очень просто, если я делаю: virsh dumpxml $1 > /tmp/lor.xml , во время работы хука, у меня libvirt вообще виснет наглухо (приходится его перезапускать)...

$1, это имя вирт. машины, которое передаёт libvirt, хуку - это всё по документации, всё стандартное, никаких костылей и фантазий: https://www.libvirt.org/hooks.html

DALDON ★★★★★
() автор топика

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

post-factum ★★★★★
()
Ответ на: комментарий от ananas

Ничего не помогает... Видно, что хук ожидает 5сек, ну а затем libvirt зависает. Если вместо: virsh dumpxml «$mname» > /tmp/lor.xml , написать: echo «lor», то через 5сек. просто виртуалка запустится.

#!/bin/bash
if [ "$2" = "started" ] ; then
   mname=$(echo $1)
   export=mname
   function atexit () {
    (sleep 5; virsh dumpxml "$mname" > /tmp/lor.xml) &
   }
trap atexit EXIT
else
  exit 0
fi
DALDON ★★★★★
() автор топика
Ответ на: комментарий от post-factum

Просто это уже целая разработка выходит... Чего хотелось-бы избежать. Мне не достаточно передавать команду в пайп, мне мне надо ещё как-то vmname передать...

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

Да, сложно. Я предполагал, что полностью форкнуть процесс из баша, это не сложное дело. А тут уже выходит мне надо сооружать целый демон...

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

мля, знак равенства убери. и хоть децл man bash почитай!

#!/bin/bash
if [ "$2" = "started" ] ; then
   export mname="$1"
   function atexit () {
    (sleep 5; virsh dumpxml "$mname" > /tmp/lor.xml) &
   }
trap atexit EXIT
else
  exit 0
fi

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

Ну а что..? Пайп, кто-то должен создавать, кто-то его должен вычитывать... - Это насколько я понимаю должен быть отдельный процесс. За этим процессом надо следить чтобы он не падал... А если упал, надо его поднимать, и т.д. - Это уже целая история выходит. Демон.

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

Ошибся. Убрал, конечно равенство. Привёл в правильный вид. Не помогает, проблема не в переменной. export вообще не нужен! Без него тоже всё работает в subshell, echo это подтвержадет!

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

Ну смотри, так-как написал ты в посте: bash полностью форкнуть процесс, без родителя (комментарий) , это хорошо. Но хук я запускаю не сам. А его запускает libvirt, с параметром $1, имя вирт. машины. Соот-но, мне надо как-то заранее запускать скрипт, который создаст пайп, потом надо создать скрипт, который будет постоянно слушать сей пайп. В хуке надо написать команду, чтобы она кидала туда $vmname. Слушатель пайпа, должен будет выдирать оттуда имена, и запускать в связи с этим другие команды... - Я сейчас проработаю твой пост. Может и выйдет чего. Но буду всячески рад идеям всяким. Но в целом - я удивлён, что форкнуть так просто не получается...

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

Да какая там разработка. Смотри мой пример. Вот демон:

#!/usr/bin/env bash
 
LOG="/var/log/sa-learn.log"
FIFO="/run/sa-learn-daemon.fifo"
RESPONSE="/run/sa-learn-client.fifo"
 
rm -f $FIFO
rm -f $RESPONSE
mkfifo $FIFO
mkfifo $RESPONSE
chown nobody:nogroup $FIFO
chown nobody:nogroup $RESPONSE
 
while true
do
        if read line <$FIFO
        then
                echo "$line" >>$LOG
                args=$(echo $line | cut -d ';' -f 1)
                msg=$(echo $line | cut -d ';' -f 2)
                /usr/bin/sa-learn --no-sync $args $msg >>$LOG 2>&1
                /usr/bin/sa-learn --sync >>$LOG 2>&1
                rm -f $msg
                echo "OK" >$RESPONSE
        fi
done <$FIFO

Вот клиент:

#!/usr/bin/env bash

LOCK="/tmp/sa-learn.lock"
FIFO="/run/sa-learn-daemon.fifo"
RESPONSE="/run/sa-learn-client.fifo"

exec 200> $LOCK
flock -x 200
 
MSG=$(mktemp)
 
cat <&0 >$MSG
 
echo "$*;$MSG" >$FIFO
 
while true
do
        if read line <$RESPONSE
        then
                if [[ "$line" == "OK" ]]
                then
                        flock -u 200
                        exit 0
                fi
        fi
done
 
flock -u 200
exit 0

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

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

ну хоцца человеку sleep - ну и хрен с ним. кошернее было-бы цикл с pkill -0 $0, но то такое. да и там небольшой sleep нужен был бы

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

Сначала слип, потом чай в пакетиках, а потом баба резиновая.

post-factum ★★★★★
()
Ответ на: комментарий от DALDON

Да в каком порядке ты это всё пытаешься делать? Кто и как отдает команду на старт VM, кто и как отдает команду на запуск virsh dumpxml? Может, тебе вообще нужен семафор.

мне надо как-то заранее запускать скрипт, который создаст пайп, потом надо создать скрипт, который будет постоянно слушать сей пайп

Это может быть один и тот же скрипт.

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

Да в каком порядке ты это всё пытаешься делать? Кто и как отдает команду на старт VM, кто и как отдает команду на запуск virsh dumpxml?

я так понял, тс вот этот хук наваять пытается - https://www.libvirt.org/hooks.html

ananas ★★★★★
()

Script arguments

The hook scripts are called with specific command line arguments, depending upon the script, and the operation being performed.

The guest hook scripts, qemu and lxc, are also given the full XML description for the domain on their stdin. This includes items such the UUID of the domain and its storage information, and is intended to provide all the libvirt information the script needs.

...

Deleted
()
Ответ на: комментарий от ananas

я так понял, тс вот этот хук наваять пытается - https://www.libvirt.org/hooks.html

Похоже. Но, насколько я понимаю, оно решается:

(sleep 5; virsh dumpxml $1 | sendxmlsomewhere) &
exit 0

Тоже с race, но зато просто.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 2)
Ответ на: комментарий от tailgunner

да там главное SIGCHLD заигнорить, чтобы основной скрипт не висел в списке процессов до завершения сабшела

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