GNU/Linux >> Znalost Linux >  >> Linux

Jak čekat na ukončení nedětských procesů

Na BSD a OS X můžete přesně to udělat pomocí kqueue s EVFILT_PROC+NOTE_EXIT. Není vyžadováno žádné hlasování. Bohužel neexistuje ekvivalent pro Linux.


Můžete také vytvořit soket nebo FIFO a číst na nich. FIFO je obzvláště jednoduché:Připojte standardní výstup vašeho dítěte k FIFO a čtěte. Čtení se zablokuje, dokud dítě neodejde (z jakéhokoli důvodu) nebo dokud nevyšle nějaká data. Budete tedy potřebovat malou smyčku k odstranění nechtěných textových dat.

Pokud máte přístup ke zdroji dítěte, otevřete FIFO pro zápis při jeho spuštění a pak na to jednoduše zapomeňte. Operační systém vyčistí otevřený deskriptor souboru, když dítě skončí, a váš čekající „rodičovský“ proces se probudí.

Nyní to může být proces, který jste nezačali ani nevlastníte. V takovém případě můžete binární spustitelný soubor nahradit skriptem, který spustí skutečný binární soubor, ale také přidá monitorování, jak je vysvětleno výše.


Zatím jsem našel tři způsoby, jak to udělat v Linuxu:

  • Dotazování:Existenci procesu kontrolujete často, buď pomocí kill nebo testováním existence /proc/$pid , stejně jako ve většině ostatních odpovědí
  • Použijte ptrace systémové volání pro připojení k procesu jako ladicí program, takže budete upozorněni, když skončí, jako v odpovědi a3nm
  • Použijte netlink rozhraní pro naslouchání PROC_EVENT_EXIT zprávy - tímto způsobem jádro sdělí vašemu programu pokaždé, když proces skončí, a vy jen čekáte na správné ID procesu. Viděl jsem to popsané pouze na jednom místě na internetu.

Nestydatá zásuvka:Pracuji na programu (samozřejmě s otevřeným zdrojovým kódem; GPLv2), který umí kterýkoli z těchto tří.


Nic ekvivalentní wait() . Obvyklou praxí je dotazování pomocí kill(pid, 0) a hledá návratovou hodnotu -1 a errno z ESRCH na znamení, že proces je pryč.

Aktualizace: Od linuxového jádra 5.3 existuje pidfd_open syscall, které vytvoří fd pro daný pid, který může být dotazován, aby dostal upozornění, když pid skončil.


Linux
  1. Jak vyhledat výstupní kódy pro aplikace?

  2. Jak nainstalovat a nakonfigurovat Monit na Linuxu pro monitorování procesů

  3. Jak zkontrolovat velikost haldy pro proces v Linuxu

  1. Co jsou zombie procesy a jak najít a zabít zombie procesy?

  2. 30 Cvičení procesů Linuxu pro systémové správce

  3. Jak čekat na restart serveru pomocí Ansible?

  1. Linux – Jak zrušit sdílení sítě pro aktuální proces?

  2. Jak najít všechny podřízené procesy?

  3. Jak nastavit ID procesu v Linuxu pro konkrétní program