GNU/Linux >> Znalost Linux >  >> Linux

Docker nereaguje na CTRL+C v terminálu

Obrázek kontejneru, který používáte, s největší pravděpodobností nezpracovává správně signály procesu. Pokud obrázek vytváříte, změňte jej podle odpovědi Rolanda Weberse. V opačném případě jej zkuste spustit s --init .

docker run -it --init ....

Toto opravuje Ctrl+C. Zdroj:https://docs.docker.com/v17.09/engine/reference/run/#specify-an-init-process


Tento příspěvek navrhuje CTRL-Z jako řešení pro odeslání procesu na pozadí a následné ukončení procesu pomocí jeho id procesu:Nelze zabít skript Python pomocí Ctrl-C

Možné problémy:

  • Program zachytí ctrl-c a nedělá nic, což je velmi nepravděpodobné.

  • Existují procesy na pozadí, které nejsou spravovány správně. Signál přijímá pouze hlavní proces a dílčí procesy se zablokují. Velmi pravděpodobné, co se děje.

Navrhované řešení:

  • Podívejte se do dokumentace k programu, jak se správně spouští a zastavuje. Zdá se, že ctrl-c není správný způsob.

  • Zabalte program do bash skriptu docker-entrypoint.sh, který blokuje proces kontejneru a je schopen zachytit ctrl-c. Tento příklad bash by měl pomoci:https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash

  • Po zachycení ctrl-c vyvolejte správnou metodu vypnutí pro notebook ipython.


Problém je v tom, že Ctrl-C odešle signál procesu nejvyšší úrovně uvnitř kontejneru, ale tento proces nemusí nutně reagovat tak, jak byste očekávali. Proces nejvyšší úrovně má uvnitř kontejneru ID 1, což znamená, že nezíská výchozí obslužné rutiny signálů, které procesy obvykle mají. Pokud je procesem nejvyšší úrovně shell, pak může signál přijímat prostřednictvím svého vlastního handleru, ale nepředává jej příkazu, který se provádí v rámci shellu. Podrobnosti jsou vysvětleny zde. V obou případech se ukotvitelný kontejner chová, jako by jednoduše ignoroval Ctrl-C.

Pokud vytváříte své vlastní obrázky, řešením je spustit minimální proces init, jako je tini nebo dumb-init, jako proces nejvyšší úrovně uvnitř kontejneru.


Linux
  1. Výzva terminálu se nebalí správně?

  2. Proč není CD program?

  3. Linux – Kdy nemám zabít -9 A proces?

  1. Terminál:Příkaz Termcapinfo nebyl nalezen?

  2. Lpr nefunguje – plánovač neodpovídá?

  3. příkaz docker nebyl nalezen

  1. Tomcat běží, ale port 8080 neodpovídá

  2. Proměnná prostředí TERM není nastavena

  3. Proces Linuxu na pozadí - Zastaveno v úlohách?