Terminál a procesy
Otevřete Nastavení → Pluginy a prohlédněte si plugin terminal, který je součástí instalace; administrátoři přidělují přístup i účtům bez oprávnění administrátora v Uživatelé → Povolené pluginy. V chatu může Elowen čtyřmi nástroji spouštět příkazy a spravovat procesy a postranní panel chatu zobrazuje část Procesy. Na nových instalacích je plugin zapnutý.
Nástroje a ovládání procesů
| Nástroj | Co dělá |
|---|---|
Bash |
Spustí příkaz shellu a vrátí spojený výstup a návratový kód. |
ListProcesses |
Vypíše procesy na pozadí spuštěné v této konverzaci. |
ProcessOutput |
Přečte výstup procesu na pozadí nebo počká na jeho dokončení. |
KillProcess |
Okamžitě zastaví jeden z procesů na pozadí této konverzace. |
Spouštění na místním počítači
Cíl Váš počítač používá standardní přenášenou procesní relaci Sandboxu. Bash odebírá její kanály stdout, stderr, stdin a cwd, aniž by spouštěl shell hostitele. Úspěšné příkazy na popředí si uchovají hlášený pracovní adresář zvlášť pro každé zařízení. Odpojení na popředí, úlohy a služby na pozadí, sběr výstupu a rušení zachovávají stávající registr procesů a ovládání. Navázaná relace si drží připuštěné spojení; nová spojení nemohou staré procesy převzít. Ztracené spojení je LOCAL_EXECUTION_LOST a odeslaný příkaz bez konečného výsledku má neznámý výsledek. Nepodporované odložení výstupu na disk se hlásí zvlášť a nepřepíše úspěšné ukončení shellu.
Přidělení přístupu uživateli
Plugin lze přidělit. Chcete-li ho povolit účtu bez oprávnění administrátora:
- Otevřete Uživatelé a vyberte účet.
- V části Povolené pluginy zvolte Spravovat.
- Vyberte
terminala klikněte na Uložit změny.
Administrátoři potřebují stejné oprávnění jako každý jiný účet; není automatické. Oprávnění plugin zpřístupní, ale oprávnění účtu k nástrojům mohou jednotlivé nástroje dál omezit. Plugin sám před spuštěním příkazu nechce potvrzení. Pravidlo oprávnění účtu ale může u příkazu nastavit, aby se nejdřív zeptal. Příkaz, který takto schválíte, se sám nikdy nepřesune na pozadí. Viz Uživatelé a přístup.
Kde příkazy běží
Elowen při každém spuštění určí přístup k příkazům přes plugin Sandbox. V konverzaci Projektu příkazy dodržují zásady přístupu daného Projektu a startují v kořeni Projektu; ve spravovaném prostředí Projektu běží v tomto prostředí. Konverzace nasměrovaná do jiného adresáře, například do pracovní kopie Gitu, běží tam.
Pracovní adresář se přenáší z jednoho úspěšného příkazu na popředí na další. Když příkazu předáte cwd, příkaz v tomto adresáři začne. Pokud příkaz úspěšně skončí, adresář, ve kterém skončil, se stane pracovním adresářem pro další volání. Proměnné a funkce shellu se mezi voláními nepřenášejí.
Pokud Sandbox není dostupný, spouštění ve spravovaném Projektu se odmítne. Explicitní režim přímého hostitele smí použít jen vlastník instance. Blokující restart vlastního daemona Elowenu a požadavek na obejití Sandboxu se odmítnou.
V CLI mění pracovní adresář konverzace příkaz /cd. Argument cwd ho pro jeden příkaz přepíše.
Příkazy na popředí
Volání Bash na popředí čeká nejvýše timeout milisekund. Výchozí hodnota je 120 000 ms a minimum 1 ms. Obvyklé maximum je 600 000 ms; nastavení nasazení může změnit výchozí hodnotu i maximum, maximum ale nelze nastavit pod výchozí hodnotu. Nastavení nasazení se čte při startu Elowenu, proto po změně Elowen restartujte.
Když ve vlastní interaktivní konverzaci člověka vyprší lhůta, Elowen příkaz obvykle přesune na pozadí a vrátí jeho ID procesu. Příkaz běží dál bez další lhůty a jeho výstup si můžete vyzvednout později. Nedělá to u příkazu schváleného v dotazu na oprávnění, když je plný limit procesů na pozadí, ani u sdílené místnosti, delegované práce, workflow, naplánované úlohy či jiné práce bez relace; takové příkazy se na lhůtě zastaví. V CLI můžete běžící příkaz na popředí odpojit sami stisknutím Ctrl+B. Jeho výstup zůstane dostupný přes nástroje pro procesy. Na vlastní instalaci může provozovatel nastavit bashDefaultTimeoutMs a bashMaxTimeoutMs v souboru harness.json v adresáři instance a potom restartovat daemona. Obě hodnoty jsou v milisekundách a musí být v rozsahu 1..900000, maximum alespoň na úrovni výchozí hodnoty.
Příkaz, který je jen sleep a trvá dvě sekundy nebo déle, se na popředí odmítne, například sleep 2 nebo sleep 5m, protože tah jen pročekává. Práci spusťte s run_in_background: true a na její dokončení počkejte pomocí ProcessOutput. Příkaz, který dělá víc než spí, například sleep 19; tail build.log, povolený je. Kratší spánky než dvě sekundy jsou povolené také.
Bash pro odpojené spouštění přijímá jen run_in_background. Zrušený argument background jeho schéma odmítne.
Procesy na pozadí
Nastavte run_in_background: true a příkaz se spustí na pozadí. Elowen vrátí ID procesu a po jeho dokončení vás upozorní. Ke správě použijte ListProcesses, ProcessOutput nebo KillProcess. Pro dlouho běžící server nebo watcher nastavte backgroundMode: "service"; výchozí režim na pozadí je job.
Část Procesy v postranním panelu chatu ukazuje běžící procesy na pozadí a umožňuje prohlédnout výstup nebo některý zastavit. Restart daemona procesy na pozadí ukončí a odstraní jejich záznamy, takže server nebo watcher je nutné po restartu spustit znovu. Relace a účet mohou ve výchozím nastavení držet nejvýše 16 procesů na pozadí; nastavitelný rozsah je 1–64. Když je limit plný, další proces nelze spustit ani odpojit. Jakmile proces skončí, přestane se do limitu počítat. Další pokus o spuštění procesu na pozadí odstraní skončené procesy ze seznamu, proto si výstup dokončeného procesu přečtěte dřív, než spustíte další. Naplánované úlohy a pracovníci bez konverzace procesy na pozadí spustit ani odpojit nemohou.
ProcessOutput vrací nový výstup od posledního čtení; pro uchovaný výstup nastavte all: true. Čeká ve výchozím nastavení až 30 sekund, nejvýše 600 sekund. Čtení, kterému vyprší čas, proces nezastaví; nastavte block: false, chcete-li nahlédnout bez čekání. V CLI může čekající čtení uvolnit i Ctrl+B, proces pak běží dál pro pozdější čtení. Vyrovnávací paměť výstupu drží jen posuvný konec pod limitem výstupu, starší výstup se tedy může ztratit a výsledek hlásí, kolik. Přečtení dokončeného procesu vrátí zbývající výstup a vyzvedne ho, takže jeho ID už nefunguje.
KillProcess okamžitě zastaví proces i jeho sledované potomky, bez čistého ukončení a vyprázdnění bufferů, a zahodí vyrovnávací paměť výstupu. Použijte ho, jen když je to přijatelné; build nebo migrace může zůstat nedokončený. Neznámé ID žádný proces nezastaví.
Výstup a konfigurace
Vložený výstup je ve výchozím nastavení omezen na 60 000 bajtů. U dlouhého výsledku na popředí si Elowen ponechá začátek a konec, oznámí, kolik vynechala, a zachycený výstup uloží zvlášť; vrácenou cestu použijte s nástrojem Read. Zachycený výstup je omezen na 8 MB a částečný záznam hlásí, kolik se zahodilo. Výstup na pozadí drží posuvný konec do stejného limitu. Nastavitelný rozsah je 10 000–500 000 bajtů.
Konfigurace platí pro celou instanci; nastavení pro jednotlivé účty neexistují. Zapnutí pluginu vyžaduje souhlas se zveřejňováním událostí, které drží stav interaktivního terminálu synchronizovaný mezi vašimi kartami. Uložením těchto nastavení se Elowen restartuje, aby se změna projevila, a změny konfigurace Sandboxu ovlivní spuštění dalšího příkazu. Nastavení pro celou instanci najdete v detailu pluginu pod Nastavení → Pluginy:
| Nastavení | Klíč | Výchozí | Rozsah |
|---|---|---|---|
| Limit výstupu | outputCap |
60 000 bajtů | 10 000–500 000 |
| Procesy na pozadí na relaci a účet | maxBackgroundProcesses |
16 | 1–64 |
V režimu Plánování jsou dostupné ListProcesses a ProcessOutput. Bash zůstává dostupný jen podle pravidel nedestruktivního shellu v režimu Plánování. KillProcess v režimu Plánování dostupný není. Bash a KillProcess mohou změnit stav systému. Spouštění na pozadí přímo na hostiteli vyžaduje Linux.
Smazání Projektu
Potvrzené odstranění Projektu zastaví jeho procesy na pozadí přes zachycený projectRef, i když konverzace mezitím zvolila jiný Projekt. Terminal deklaruje provides.projectRemoval a pro interaktivní shelly registruje očekávaný handler registerProjectRemoved. Handler ohradí nová otevření, vyprázdní už započatou přípravu, zavře vybrané PTY a počká na jejich verdikty channel.closed, včetně shellů už zavřených z doku. Neznámé ukončení čištění odmítne; soubory se nesmí smazat, dokud tento hook neuspěje. Hook nikdy nevybírá ani nemaže cesty v souborovém systému.
Interaktivní terminály
V Projektech vyberte na kartě Projektu ikonu terminálu a otevřete interaktivní shell. Okno používá vaše nastavení vzhledu v Účet → Terminál. Minimalizujte ho nebo stiskněte Escape a shell běží dál v doku; klepnutím na jeho popsanou ikonu ho obnovíte. Druhý terminál ve stejném Projektu má očíslovaný popis. Volbou X shell okamžitě ukončíte. Po ukončení shellu otevře Nový terminál v tomto Projektu další.
Přihlášená osoba na webu může v Projektu otevřít interaktivní shell a psát do něj. Platí pro něj stejné rozhodnutí Sandboxu jako pro příkaz: terminál provozovatele běží přímo na hostiteli, terminál kohokoli jiného v omezeném prostředí s domovským adresářem jeho účtu (HOME) a Izolovat příkazy běžných účtů rozhoduje pro stejné lidi, pro které rozhoduje u příkazů. Terminál spravovaného Projektu běží v jeho spuštěném prostředí a startuje v adresáři Projektu. Pokud je prostředí zastavené, nejdřív ho spusťte v části Prostředí daného Projektu. Terminály na hostiteli i ve spravovaném prostředí používají Bash s ovládáním úloh, včetně Ctrl+C pro přerušení příkazu na popředí.
U Projektu typu Váš počítač musí být počítač online a jeho klient aktuální. Linuxové počítače potřebují /usr/bin/python3; Windows používají PowerShell daného počítače v terminálu ConPTY a vyžadují build Windows 18309 nebo novější. Jiné operační systémy počítače interaktivní terminál otevřít nemohou. Shell používá přihlášení Gitu a GitHub CLI z daného počítače. Odpojený nebo zastaralý klient se hlásí v okně terminálu; před dalším pokusem ho aktualizujte nebo znovu připojte. Opětovné připojení počítače starý terminál ukončí, proto potom otevřete nový.
Přihlašovací údaj účtu ke GitHubu je v izolovaných shellech na hostiteli i ve spravovaných shellech k dispozici podle stejných pravidel jako u Bash, s výstupem údajů začerněným. Shell přímo na hostiteli tento údaj nedostane.
Terminál vyžaduje přihlášenou webovou relaci. Osobní API token i vlastní údaj agenta se odmítnou, protože ani jeden není člověk u klávesnice. Účet může mít otevřené čtyři terminály najednou a instance 32 a terminál lze otevřít jen v Projektu, jehož je účet členem. Ztráta členství nebo oprávnění k pluginu terminál ukončí.
Minimalizace nechá terminál připojený a běžící. Po obnovení stránky nebo ztrátě spojení prohlížeče čeká až třicet minut na váš návrat; potom se shell ukončí. Obnovení stránky vrátí až 1 MiB posledního výstupu terminálu. Programy na celou obrazovku někdy potřebují změnit velikost okna, aby se překreslily. Otevření stejného terminálu v druhém okně ho převezme a starší okno nabídne vzít si ho zpět. Zavřením terminálu se shell a vše, co spustil, okamžitě ukončí, bez dotazu. Terminály nepřežijí restart daemona, stejně jako procesy na pozadí výše.