Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 30 odgovora
  • 7.480 pregleda

Najnovija ↓

Pisanje systemd daemona :) 06.03.2019. u 11:43 · pre 93 meseca #1
Sad je gotovo, sad cu da vas smaram neko vreme :)

Ok, hocu da napisem svoj daemon, cisto eksperimenta radi hocu da napravim chat server u C# .net core 3.0 preview kao proof of concept. Sad, ja pokrenem listener thread, ali sta radim sa glavnim threadom koji sam dobio od systemd launchera?

U Windows svetu kad pravim servis ja sam obavezan da javim SCMu (Service Control Manager) koji me je i pozvao da je servis "ziv" i da potom uradim return i vratim thread SCMu. Ako to ne uradim (obe stvari), SCM ili prsne odmah ili timeout-uje start operaciju i ubije servisni proces pretpostavljajuci da je pokretanje servisa prslo.

Kako systemd to resava? Ako ja ne uradim return kako on zna da je moj servis ziv? Ako pogledam moj servis za mount, vidim da je proces exited, ali ako npr pogledam neki sistemski servis:

Code:
mmix@BlackWolf:~/projects/Helios/HeliosServer/Helios.Server$ systemctl status accounts-daemon.service 
● accounts-daemon.service - Accounts Service
   Loaded: loaded (/lib/systemd/system/accounts-daemon.service; enabled; vendor 
   Active: active (running) since Wed 2019-03-06 08:19:22 CET; 3h 20min ago
 Main PID: 1356 (accounts-daemon)
    Tasks: 3 (limit: 4915)
   Memory: 7.5M
   CGroup: /system.slice/accounts-daemon.service
           └─1356 /usr/lib/accountsservice/accounts-daemon

Mar 06 08:19:22 BlackWolf systemd[1]: Starting Accounts Service...
Mar 06 08:19:22 BlackWolf accounts-daemon[1356]: started daemon version 0.6.45
Mar 06 08:19:22 BlackWolf systemd[1]: Started Accounts Service.


Njegov proces i dalje radi (sto i treba), ali systemd je svestan da je servis aktivan i zavrsio je sa podizanjem, ako neko ima Requires na ovaj servis bice pokrenut. Dakle, nekako postoji neka signalizacija, medjutim ja ne mogu da nadjem na netu nista o ovome.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Pisanje systemd daemona :) 06.03.2019. u 12:02 · pre 93 meseca #2
Nemoj da se brines, napises obican program pokrenes ga preko systemd-a i to je to. Mislim da je systemd asinhron pa neces blokirati ostale procese da se pokrenu. Cak ce ti i restartovati proces ako pukne.
Evo ti kratak tutorial:
https://medium.com/@benmorel/c...vice-with-systemd-611b5c8b91d6

Stvar je krajnje prosta, nema tu nikakve filozofije.
Re: Pisanje systemd daemona :) 06.03.2019. u 12:21 · pre 93 meseca #3
Da, ali ako neko zavisi od mog servisa, kako systemd zna da sam ja spreman? Recimo moj chat server, hocu prvo da ucitam neku kofiguraciju, namestim nesto, ucitam nesto iz daleka, mozda treba 2, mozda 20 sekundi da ja pokrenem server. Kako systemd zna da sam spreman, tj active?

Ako neki unit ima required=helios-server kako zna da moze da ga pokrene?
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Pisanje systemd daemona :) 06.03.2019. u 12:30 · pre 93 meseca #4
Ne zna systemd da li si spreman ili ne. systemd je samo jedan od n init alternativnih procesa na Linux-u.To da li si spreman javi klijentu tvoje aplikacije ili jednostavno mozes da slusas tek onda kad si spreman.
Inace to da li si spreman mozes da izvedes jos i preko skripte koja ce izaci sa -1 0 i slicno, dok ces proces forkovati. Standardno na Unix-ima.
Osim toga systemd ima neki svoj api u koji uopste nisam zalazio posto nemam nameru da se vezujem za odredjeni init sistem ;)
Re: Pisanje systemd daemona :) 06.03.2019. u 12:30 · pre 93 meseca #5
Kako znaš da je na remote serveru pokrenut http demon.
Ne znaš, probaš, pa ako ne uspe probaš ponovo ili javiš grešku.

A systemd zna process id tvog servisa. I zna da li je živ ili nije.
Re: Pisanje systemd daemona :) 06.03.2019. u 12:37 · pre 93 meseca #6
Kako onda radi Requires? Cemu sluzi uopste onda, onda komotno mozes asinhrono da pustis sve servise pa kom obojci kom opanci, nek oni sami paze dal je njihov dependency aktivan (jer ionako moraju)? Malo je to degute.

Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Pisanje systemd daemona :) 06.03.2019. u 12:41 · pre 93 meseca #7
requires sluzi tome da neke procese ne startuje asinhrono. Kazem na Unix-u je standardno da imas skriptu koja javi 0 ili -1 prilikom izlaska i to je signal init daemon-u da li je nesto uspesno startovano ili ne.
Re: Pisanje systemd daemona :) 06.03.2019. u 12:42 · pre 93 meseca #8
Kako upšte radi 1GB MS đubreta koje moraš da dovučeš na Linux da bi imao .Net core?
Po meni je neka vrsta travestije da pišeš C# koji treba da radi na Linuxu. Ljudi su odavno shvatili da ako je nešto teško da se napravi u C-u na Linuxu, urade to u Javi.
Re: Pisanje systemd daemona :) 06.03.2019. u 12:45 · pre 93 meseca #10
Ok, ali sinhrono startovanje podrazumeva red, red podrazumeva pocetak i kraj svakog elementa. Ako systemd ne zna kad je kraj moje inicijalizacije kako moze da sinhrono pokrene sledeci u redu? Arbitrarni timeout?

Ja ako izadjem iz main threada sa greskom bilo kojom (0 ili -1) proces se gasi. Ako zapakujem moj izvrni fajl u (ba)sh onda systemd nema moj PID i ne zna dal sam uopste ziv.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Pisanje systemd daemona :) 06.03.2019. u 13:01 · pre 93 meseca #12
Citat:
djoka_l:
Kako upšte radi 1GB MS đubreta koje moraš da dovučeš na Linux da bi imao .Net core?
Po meni je neka vrsta travestije da pišeš C# koji treba da radi na Linuxu. Ljudi su odavno shvatili da ako je nešto teško da se napravi u C-u na Linuxu, urade to u Javi.


.NET core zapravo radi savim lepo. Nisam jos radio benchmark ali mislim da su konacno batalili Mono JIT. Ako jesu, performanse su veoma blizu C++ koda.

Ceo SDK sa runtime-om je 270Mb, sam runtime je 70Mb za core plus jos 19Mb ako koristis asp.net. S tim sto ti ne treba, ako uradis full build prekopirace biblioteke u bin folder i distribuiras ih direktno, tako da je footprint minimalan.

Ovo je .NET core, ne .NET Framework, nema sistemskih dependencija i bloat-a.


Sve i da nemam bruku coda, C# mi je daleko bolje resenje od JVMa i Jave/Kotlina. To "ili je C ili Java" je stvar proslosti. .NET core je fully open source a C# je daleko superiorniji jezik od Jave, cak i od Kotlina, JITovan kod uvek radi na metalu. JetBrains cak ima i Linux alat (Rider) za .NET core preko kojeg sad radim. Davno je proslo vreme bloatovanog i sporog Monoa. Uskoroc ese pojaviti GUIx opcije za .net core i pocece sve vise da se javljaju aplikacije u njemu. Ja iskreno ne vidim nista losse u tome, ili gresim?


Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Pisanje systemd daemona :) 06.03.2019. u 13:54 · pre 93 meseca #13
Ok, fore radi napravio sam self-contained build:

Code:
mmix@BlackWolf:~/projects/Helios/HeliosServer/Helios.Server$ dotnet publish -c Release -r linux-x64 --self-contained true
Microsoft (R) Build Engine version 16.0.385-preview+g966cdf2ac6 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restoring packages for /home/mmix/projects/Helios/HeliosServer/Helios.Server/Helios.Server.csproj...
  Generating MSBuild file /home/mmix/projects/Helios/HeliosServer/Helios.Server/obj/Helios.Server.csproj.nuget.g.props.
  Restore completed in 144.25 ms for /home/mmix/projects/Helios/HeliosServer/Helios.Server/Helios.Server.csproj.
/opt/dotnet/sdk/3.0.100-preview-010184/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.RuntimeIdentifierInference.targets(151,5): message NETSDK1057: You are using a preview version of .NET Core. See: https://aka.ms/dotnet-core-preview [/home/mmix/projects/Helios/HeliosServer/Helios.Server/Helios.Server.csproj]
  Helios.Server -> /home/mmix/projects/Helios/HeliosServer/Helios.Server/bin/Release/netcoreapp3.0/linux-x64/Helios.Server.dll
  Helios.Server -> /home/mmix/projects/Helios/HeliosServer/Helios.Server/bin/Release/netcoreapp3.0/linux-x64/publish/

mmix@BlackWolf:~/projects/Helios/HeliosServer/Helios.Server$ cd bin/Release/netcoreapp3.0/linux-x64/publish/
mmix@BlackWolf:~/projects/Helios/HeliosServer/Helios.Server/bin/Release/netcoreapp3.0/linux-x64/publish$ du -BM
73M    .
mmix@BlackWolf:~/projects/Helios/HeliosServer/Helios.Server/bin/Release/netcoreapp3.0/linux-x64/publish$ ls Helios* -lah
-rwxrw-rw- 1 mmix mmix 117K Mar  6 13:25 Helios.Server
-rw-r--r-- 1 mmix mmix  27K Mar  6 13:25 Helios.Server.deps.json
-rw-rw-r-- 1 mmix mmix 6.5K Mar  6 13:25 Helios.Server.dll
-rw-rw-r-- 1 mmix mmix  840 Mar  6 13:25 Helios.Server.pdb
-rw-r--r-- 1 mmix mmix   26 Mar  6 13:25 Helios.Server.runtimeconfig.json

mmix@BlackWolf:~/projects/Helios/HeliosServer/Helios.Server/bin/Release/netcoreapp3.0/linux-x64/publish$ ./Helios.Server
Helios Server 0.1 Development (0), build 0.1.0.24156
Press <Enter> to exit... 


Code:
mmix@BlackWolf:~$ telnet localhost 1234
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Helios Server 0.1 Development (0), build 0.1.0.22299
Connection closed by foreign host.

mmix@BlackWolf:~$ ps -o rss,command 22586
  RSS COMMAND
27696 ./Helios.Server


Dakle, completan release a da klijent uopste ne mora da instalira bilo kakav runtime je 73Mb (sto ukljucuje i roslyn i JIT i core), od cega je aplikacija nekih 150K zajedno sa core launcehrom. Memory footprint pokrenute aplikacije je 26Mb, sto je nista i za losije masine danas.
Ali realno, bolje je imati runtime kao sto imas za Javu i onda deployment ima samo 150Kb (u ovom slucaju). 1GB? Ne vise, ni u kom slucaju.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Pisanje systemd daemona :) 06.03.2019. u 14:05 · pre 93 meseca #14
Ako ti pak smeta sto ima puno .dll fajlova iz samog core-a, mozes da warpujes u single executable gde si odbacuju neiskoriscene biblioteke. U ovom slucaju dobijes jedan izvrsni fajl od <30Mb:

mmix@BlackWolf:~/projects/Helios/HeliosServer/Helios.Server/bin/Release/netcoreapp3.0/linux-x64$ ./warp-packer --arch linux-x64 --exec Helios.Server --input_dir publish --output helios-complete
Compressing input directory "publish"...
Creating self-contained application binary "helios-complete"...
All done
mmix@BlackWolf:~/projects/Helios/HeliosServer/Helios.Server/bin/Release/netcoreapp3.0/linux-x64$ ls helios-complete -la
-rwxr-xr-x 1 mmix mmix 30195347 Mar 6 14:02 helios-complete
mmix@BlackWolf:~/projects/Helios/HeliosServer/Helios.Server/bin/Release/netcoreapp3.0/linux-x64$ ./helios-complete
Helios Server 0.1 Development (0), build 0.1.0.24156
Press <Enter> to exit...
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Pisanje systemd daemona :) 06.03.2019. u 18:00 · pre 93 meseca #16
Dogovoreno :D

Sad citam bas, nije bas tako jednostavno, mora da se forkuje sto je veoma Linux-stvar i nije cross-platform. Mislim da postoje platform specific verzije host managera (long story) koje sluze upravo tome. Probacu pa kad dobijem .deb javim :D

Inace, ima ta fora sa chainovanjem servisa, ali mora da ulkjucuje fork varijante, ili Type=fork ili Type=exec za [Service]. Nasao sam opis u systemd-service man-u
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Pisanje systemd daemona :) 06.03.2019. u 19:21 · pre 93 meseca
izmenjeno 1 put, poslednji put mmix 06.03.2019. u 20:09
  1. mmix06.03.2019. u 20:09zapis iz teksta poruke
#18
Btw, kad smo vec na temu sta moze u .NET core :) Gnome 3 GTK aplikacija u tri koraka.




Hehe, ulenji sam se na windozu :) vidim nesto nece da se ugasi proces, kad ono Gtk namerno fula Application.Run loop u prazno i kad nema nijedan prozor :)

Code (csharp):

myWin.Destroyed += (sender, eventArgs) => Application.Quit();
 
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Sviđa mi se2
Re: Pisanje systemd daemona :) 06.03.2019. u 20:21 · pre 93 meseca #19
Odgovarao sam sa telefona, evo malo proširenog odgovora.

Citat:
U Windows svetu kad pravim servis ja sam obavezan da javim SCMu (Service Control Manager) koji me je i pozvao da je servis "ziv" i da potom uradim return i vratim thread SCMu. Ako to ne uradim (obe stvari), SCM ili prsne odmah ili timeout-uje start operaciju i ubije servisni proces pretpostavljajuci da je pokretanje servisa prslo.


Systemd način je da koristiš Type=notify i sd_notify() nakon što je Listen uspeo, što mi se čini kao ekvivalent ovome, s tim da ne moraš da vratiš thread systemd-u, već bi trebalo da uradiš join na listener thread - da održiš servis živim (ili da u glavnom thread-u uradiš Listen, ne treba ti zaseban, ako možeš da pozoveš sd_notify nakon listena).

Citat:
Ako zapakujem moj izvrni fajl u (ba)sh onda systemd nema moj PID i ne zna dal sam uopste ziv.


Ako ćeš ovako, ne zaboravi Type=forking, mada još od upstarta imam nekoliko negativnih iskustava sa istim, pa sam odustao od toga, nakon nekoliko istih. Jedan problem je što ne možeš da uviješ servis u bash skriptu, pa da initijalizuješ aplikaciju (npr. da pročitaš ogromne fajlove sa diska), pa da forkuješ, jer tu imaš dva forka - osim ako ne izbegneš fork u skripti exec-om. Dalje, problem je ako inicijalizacija programa već diže nekoliko threadova, jer će fork nakon inicijalizacije da klonira samo jedan thread (koji poziva fork).

Lep pregled šta "new style daemon" treba da uradi se može naći https://www.freedesktop.org/software/systemd/man/daemon.html
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme