<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Завершение дочерних процессов 2 уровня</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/10311.html</link>
    <description>Подскажите, как лучше его организовать? Ситуация следующая: дети запускаются фоном, после чего они рождают ещё детей. Мне нужно всех их вырезать, потому что, если их не прибить собственноручно, они остаются жить навсегда. Добился нужного через pkill -g $$ в конце (повесил на выход), но возникают определённые подозрения (в частности в связи с тем, что при самоубийстве в баше не появляется приглашение, видимо фишка баша для провисших дескрипторов) или же вообще ломается любой ввод (он не отображается). Я так понял, это вообще проблема, в линуксе нельзя просто взять и узнать, кого мы родили. Мне только pstree -p $bgjobpid показывает, что там кто-то где-то висит во внучках (он обходит всех на предмет родителей?), разбирать выхлоп pstree чёт видится извратом. Вообще, в интернете обещали и что pkill -P $$ будет достаточно, да только дети детей то остаются!&lt;br&gt;&lt;br&gt;Суть дела: мне нужно убить всех детей вместе с их детьми средствами, доступными родителю, в идеале получить перечень пидов и их перебить. Я могу получить пид </description>

<item>
    <title>Завершение дочерних процессов (Сейд)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/10311.html#20</link>
    <pubDate>Fri, 05 Jun 2020 17:37:54 GMT</pubDate>
    <description>Поменяли, но внизу на главной странице название почему-то осталось: https://i.imgur.com/yD5x4Dz.png&lt;br&gt;</description>
</item>

<item>
    <title>Завершение дочерних процессов 2 уровня (user user)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/10311.html#19</link>
    <pubDate>Wed, 20 May 2020 12:24:31 GMT</pubDate>
    <description>чисто из любопытства, какой сценарий привел победе fork на pthread_create?&lt;br&gt;</description>
</item>

<item>
    <title>Завершение дочерних процессов 2 уровня (Аноним)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/10311.html#18</link>
    <pubDate>Mon, 18 May 2020 23:11:17 GMT</pubDate>
    <description>&amp;gt; sigexit&lt;br&gt;&lt;br&gt;Нет такого сигнала. EXIT &amp;#8212; это обобщение bash&apos;а для обработки сигналов, по которым он должен завершаться, а также нормального его завершения.&lt;br&gt;&lt;br&gt;Но я не пойму, зачем вешать wait в trap, когда его можно разместить в конце программы.&lt;br&gt;</description>
</item>

<item>
    <title>Завершение дочерних процессов 2 уровня (Licha Morada)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/10311.html#17</link>
    <pubDate>Fri, 15 May 2020 18:19:35 GMT</pubDate>
    <description>&amp;gt; Поэтому я и пытаюсь их прибить до выхода, но я даже не &lt;br&gt;&amp;gt; знаю кого.&lt;br&gt;&lt;br&gt;Можно поддержиавать в актуальном состоянии список всех детей.&lt;br&gt;После каждого порождения, добавлять его PID в список:&lt;br&gt;CHILDERN_PIDS=&quot;$CHILDERN_PIDS $!&quot;&lt;br&gt;https://stackoverflow.com/questions/2618403/how-to-kill-all-subprocesses-of-shell&lt;br&gt;&lt;br&gt;Можно узнавать список &quot;всех детей&quot; непосредственно перед прибиванием.&lt;br&gt;CHILDERN_PIDS=$(ps -o pid= --ppid $$)&lt;br&gt;&lt;br&gt;Потом по CHILDERN_PIDS можно итерировать в простом цикле for.&lt;br&gt;Делать отдельно в каждом поколении в отношении непосредственных детей, либо рекурсивно из &quot;дедушки&quot;.&lt;br&gt;Тут хорошо описанно:&lt;br&gt;https://unix.stackexchange.com/questions/124127/kill-all-descendant-processes&lt;br&gt;&lt;br&gt;Должно работать если:&lt;br&gt;1. Дети есть строго дети, в терминах иерархии процессов, а не демонизированные сироты.&lt;br&gt;2. Дети успевают сделать что-то осмысленное после того как их прибивают и до, собственно, умирания.&lt;br&gt;Рекурсия из дедушки, в отличии от отдельной итерации в каждом поколении, смягчает ограничение 2.&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;gt; Думал на тему то</description>
</item>

<item>
    <title>Завершение дочерних процессов 2 уровня (Аноним)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/10311.html#16</link>
    <pubDate>Fri, 15 May 2020 17:05:08 GMT</pubDate>
    <description>Поэтому я и пытаюсь их прибить до выхода, но я даже не знаю кого. Думал на тему того, чтобы передавать пиды внучек через диск. но что-то и так уже слишком много файлов генерирую. Попробовал повесить wait на sigexit в мейне, что-то эксперименты не увенчались успехом и bgloop замечательно продолжает жить отдельно после нормального завершения мейна. Но sigint останавливает, это да.&lt;br&gt;</description>
</item>

<item>
    <title>Завершение дочерних процессов 2 уровня (Аноним)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/10311.html#15</link>
    <pubDate>Thu, 14 May 2020 17:25:28 GMT</pubDate>
    <description>&amp;gt; И мне не надо bgloop&amp; wait, мне надо чтобы он работал параллельно, в #10 мы в мейне ждём завершения фонового процесса, которое не случится пока мы не прервём.&lt;br&gt;&lt;br&gt;В #10 главный скрипт завершается до завершения bgloop&apos;а, в этом проблема. Мэйн должен либо что-то делать, либо ждать завершения детей, но не завершаться сам. Можно запихнуть wait в конец, после кормёжки детей данными, это спасёт от состояния гонки.&lt;br&gt;</description>
</item>

<item>
    <title>Завершение дочерних процессов 2 уровня (Аноним)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/10311.html#14</link>
    <pubDate>Thu, 14 May 2020 14:14:50 GMT</pubDate>
    <description>&amp;gt; Сейчас проверил, своим потомкам, если это не внешние программы, bash пересылает сигналы &lt;br&gt;&amp;gt; завершения сам автоматически, т.е. в коде #10 первый trap излишен, а &lt;br&gt;&amp;gt; $bgjob из #7, видимо, был прибит до вызова kill.&lt;br&gt;&lt;br&gt;1 trap там не излишен, он вообще не работает -- bgloop переходит под инит и остаётся висеть. Он должен быть заменён на&lt;br&gt;&lt;br&gt;&#091;code&#093;bgloop &amp;&lt;br&gt;trap &quot;kill $!&quot; EXIT&#091;/code&#093;&lt;br&gt;&lt;br&gt;Тогда работает, но только если bgloop остановлен kill (sigterm) в мейне. Если bgloop прерывается sigint (что происходит не каждый раз)&lt;br&gt;&lt;br&gt;&amp;gt;&amp;gt; Если отправлять pkill -g $$ в мейне, то bgloop получает только int (не term) и до обработчика exit дело не доходит.&lt;br&gt;&amp;gt; trap ... EXIT срабатывает и на INT (который также прилетает по ctrl+c), &lt;br&gt;&amp;gt; и на TERM.&lt;br&gt;&lt;br&gt;срабатывает, только exit отдельно стрелял после int при нажатии ^C, теперь только на int. Я уже сталкивался с тем, что простые примеры ведут себя не так, как чуть более сложные (из-за разного времени реакции системы надо полагать)&lt;br&gt;&lt;br&gt;&amp;gt;&amp;gt; смерть не мгновенная?&lt;br&gt;&amp;gt; Естественно: используемые с</description>
</item>

<item>
    <title>Завершение дочерних процессов 2 уровня (Аноним)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/10311.html#13</link>
    <pubDate>Thu, 14 May 2020 09:11:41 GMT</pubDate>
    <description>&amp;gt; почему $bgjob и jobs -p сообщают о процессе, который не существует с точки зрения kill при sigint. &lt;br&gt;&amp;gt; Он может и быть, а может и не быть..&lt;br&gt;&lt;br&gt;Сейчас проверил, своим потомкам, если это не внешние программы, bash пересылает сигналы завершения сам автоматически, т.е. в коде #10 первый trap излишен, а $bgjob из #7, видимо, был прибит до вызова kill.&lt;br&gt;&lt;br&gt;&amp;gt; Если отправлять pkill -g $$ в мейне, то bgloop получает только int (не term) и до обработчика exit дело не доходит.&lt;br&gt;&lt;br&gt;trap ... EXIT срабатывает и на INT (который также прилетает по ctrl+c), и на TERM.&lt;br&gt;&lt;br&gt;&amp;gt; смерть не мгновенная?&lt;br&gt;&lt;br&gt;Естественно: используемые сигналы можно перехватить и обработать. Нельзя обработать KILL, SEGV и некоторые другие.&lt;br&gt;</description>
</item>

<item>
    <title>Завершение дочерних процессов 2 уровня (Аноним)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/10311.html#12</link>
    <pubDate>Wed, 13 May 2020 19:57:16 GMT</pubDate>
    <description>Заметил что при таком использовании работает корректно, только если в bgloop прилетают оба сигнала (sigint и sigkill), если kill $bgpid не отправлять из мейна (выходе), то фоновый процесс останется висеть и вместе с внучками перейдёт под инит. Или он может остановится sigint, и тогда из мейна его уже не убить на выходе. Если отправлять pkill -g $$ в мейне, то bgloop получает только int (не term) и до обработчика exit дело не доходит. Кроме того, 1 раз я успел заметить, что внучка перед смертью переходит под инит (в принципе это не плохо), это значит смерть не мгновенная?&lt;br&gt;</description>
</item>

</channel>
</rss>
