GNU/Linux >> Znalost Linux >  >> Linux

Jak se může zdát, že proces má ve výstupu ps jiný název?

Manipulace s názvem v seznamu procesů je běžnou praxí. Např. Ve svém procesu uvádím následující:

root      9847  0.0  0.0  42216  1560 ?        Ss   Aug13   8:27 /usr/sbin/dovecot -c /etc/dovecot/d
root     20186  0.0  0.0  78880  2672 ?        S    Aug13   2:44  \_ dovecot-auth
dovecot  13371  0.0  0.0  39440  2208 ?        S    Oct09   0:00  \_ pop3-login
dovecot   9698  0.0  0.0  39452  2640 ?        S    Nov07   0:00  \_ imap-login
ericb     9026  0.0  0.0  48196  7496 ?        S    Nov11   0:00  \_ imap [ericb 192.168.170.186]

Dovecot používá tento mechanismus, aby snadno ukázal, co každý proces dělá.

Je to v podstatě stejně jednoduché jako manipulace s argv[0] parametr v C. argv je pole ukazatelů na parametry, se kterými byl proces spuštěn. Tedy příkaz ls -l /some/directory bude mít:

argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null

Alokací nějaké paměti, vložením nějakého textu do této paměti a pak vložením adresy této paměti do argv[0] zobrazený název procesu bude upraven na nový text.


Změna argv[] není přenosná. V Linuxu také nemůžete jednoduše změnit argv[0] tak, aby ukazoval na delší řetězec. Museli byste přepsat existující argumenty a dávat pozor, abyste nepřepsali proměnné prostředí, které následují v adresovém prostoru.

libbsd poskytuje implementaci setproctitle(3) pro Linux, která to značně usnadňuje.


Existují dva standardní způsoby Linuxu, jak toho dosáhnout, z nichž jeden pochází z glibc a může být přenosný na jiné systémy než Linux:

  • glibc pthread_setname_np() je pravděpodobně lepší metoda
  • Linux prctl() také funguje

Je možné, že změna argv[0] dříve fungovalo, ale alespoň na mém současném systému Linux nedělá nic s výstupem v ps .

Další podrobnosti a příklad kódu naleznete v této odpovědi:https://stackoverflow.com/a/55584492/737303


Linux
  1. Jak zajistit, aby „datum“ vydalo čas z jiného časového pásma?

  2. Jak mohu zabít proces podle jména místo PID?

  3. Jak přesměrovat výstup již běžícího procesu

  1. Jak získat PID podle názvu procesu?

  2. Jak mohu vědět, který proces používá swap?

  3. Jak mohu znát absolutní cestu běžícího procesu?

  1. Jak získat pouze ID všech běžících procesů?

  2. Jak identifikovat port k procesu?

  3. Jak seřadit výstup ps podle času zahájení procesu?