SSD Nodes Learn
Mwongozo Matt ConnorNa Matt Connor · Imeboreshwa 2026-07-24

Jinsi ya kuendesha programu kama systemd service

Jifunze kuunda faili ya service kwenye VPS ili programu ianze wakati wa boot na ianzishwe upya ikiziba. Jua jinsi ya kutumia systemd timer na journalctl.

Maana ya huduma ya systemd, na kwa nini unahitaji moja

Huduma ya systemd ni faili ndogo ya maandishi inayoiambia seva yako jinsi ya kuendesha programu: ianze wakati wa kuwaka, ianzishwe upya ikiacha kufanya kazi, na kutuma matokeo yake kwenye logi ya mfumo. Hiyo ndiyo kazi yake yote. Programu unayoianzisha kwa mkono kwenye kipindi cha SSH itafika mwisho wakati unapotoka au seva inapizimika. Programu iliyofungwa kwenye huduma ya systemd inaendelea kufanya kazi, kwa sababu seva yenyewe ndiyo inayoisimamia badala ya shell yako.

systemd ni mfumo wa init kwenye Ubuntu, Debian, Fedora, na seva nyingi za kisasa za Linux. Ni mchakato wa kwanza kuanza na ndio unaosimamia kila kitu kingine. Unapoandika faili ya huduma, unampa programu yako msimamizi huyo. Mwongozo huu unaonyesha kitengo kidogo kinachofanya kazi, sehemu tatu ambazo kila kitengo kina, jinsi ya kuiwasha na kusoma logi zake, jinsi ya kuiendesha kwa ratiba kwa kutumia timer, na jinsi ya kuizuia ili iendesheke kwa kiwango kidogo zaidi cha ruhusa.

Huduma ndogo zaidi inayofanya kazi

Faili ya huduma (service file) huishi kwenye /etc/systemd/system/, huishia na .service, na inahitaji mistari michache tu. Tengeneza moja kwa programu iliyo kwenye /usr/local/bin/myapp:

sudo nano /etc/systemd/system/myapp.service
[Unit]
Description=My application

[Service]
ExecStart=/usr/local/bin/myapp

[Install]
WantedBy=multi-user.target

Hiyo ni unit kamili inayofanya kazi. ExecStart ni amri ya kuendesha. WantedBy=multi-user.target inamaanisha anza baada ya seva kufikia hali ya kawaida ya multi-user, ambayo ndiyo inayofanya ianze wakati wa boot. Mambo mengine yote ni maboresho.

Sehemu tatu, na kazi ya kila moja

Kila faili la unit limegawanywa katika sehemu ndani ya mabano ya mraba. Huduma (service) hutumia sehemu tatu.

[Unit] inaelezea huduma na uhusiano wake. Mistari miwili utakayotumia zaidi ni:

[Unit]
Description=My application
After=network-online.target
Wants=network-online.target

Description ni jina la binadamu linaloonekana kwenye systemctl status. After=network-online.target huambia systemd isianze programu yako mpaka mtandao uwe tayari, jambo ambalo ni muhimu kwa programu yoyote inayotumia port au inayofanya muunganisho wa nje.

[Service] ni jinsi programu inavyojiendesha. Hapa ndipo mipangilio mingi ilipo:

[Service]
ExecStart=/usr/local/bin/myapp --config /etc/myapp/config.toml
WorkingDirectory=/opt/myapp
User=myapp
Restart=on-failure
RestartSec=5
Environment=LOG_LEVEL=info

User=myapp huendesha programu kama akaunti isiyo na mamlaka badala ya root, ambayo ni mstari muhimu zaidi kwa usalama. Restart=on-failure na RestartSec=5 zina sehemu zake chini, kwa sababu ndizo sababu inayowafanya watu wengi waandike huduma.

[Install] ni kile kinachotokea unapowasha huduma:

[Install]
WantedBy=multi-user.target

WantedBy=multi-user.target ni kile kinachoiunganisha huduma kwenye mchakato wa kuwaka (boot) unapofanya systemctl enable. Bila sehemu ya [Install], huduma inaweza kuanzishwa kwa mkono lakini haitajiwaka yenyewe baada ya kuwasha upya mfumo.

Iwashe na uifuatilie

Baada ya kuandika au kuhariri faili la unit, pakia tena systemd ili lisome mabadiliko, kisha washa na uanze huduma kwa hatua moja:

sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service

daemon-reload ni hatua ambayo watu husahau: systemd huhifadhi faili za unit kwenye cache, hivyo kuhariri hakubadilishi kitu hadi upakie tena. enable --now huwezesha huduma wakati wa kuwaka na kuianza mara moja. Ihakiki hivi:

sudo systemctl status myapp.service
* myapp.service - My application
     Loaded: loaded (/etc/systemd/system/myapp.service; enabled)
     Active: active (running) since Wed 2026-07-15 22:40:11 UTC; 3s ago
   Main PID: 4123 (myapp)

Active: active (running) na enabled ndivyo unavyotaka. Ili kusoma matokeo ya programu, omba journal kwa unit hii pekee:

sudo journalctl -u myapp.service -f

-f hufuatilia mistari mipya inapowasilishwa, kama tail -f. Kila kitu programu yako inachoandika kwenye standard output au standard error huwekwa hapa, bila kuhitaji mipangilio ya logging upande wako.

Anza upya baada ya kushindwa, sababu inayokufanya uwe hapa

Faida kuu ya huduma (service) ni kwamba systemd inaanza upya programu yako itakapoacha kufanya kazi. Mistari miwili inafanya hivyo:

[Service]
Restart=on-failure
RestartSec=5

Restart=on-failure inaanza upya programu ikiwa itatoka na kodi isiyo 0 au ikifeli kutokana na ishara ya crash kama SIGKILL au SIGSEGV. Kufunga programu vizuri, au kusitishwa na SIGTERM, SIGINT, SIGHUP, au SIGPIPE, hakichochei mchakato huu. RestartSec=5 husubiri sekunde tano kati ya majaribio, ili programu inayofeli papo hapo isizunguke mzunguko usio na mwisho. Hakikisha hili kwa kuua mchakato (process) na uone jinsi systemd inavyourudisha. Tumia SIGKILL: SIGTERM ya kawaida inahesabiwa kama usitishaji mzuri, hivyo on-failure haitaanzisha upya huduma:

sudo systemctl kill -s SIGKILL myapp.service
sudo systemctl status myapp.service

Ndani ya sekunde tano, hali (status) itaonyesha Main PID na active (running) mpya tena. Hiyo ndiyo sifa kuu, na ndiyo sababu huduma ni bora kuliko kuacha programu ikiwa inafanya kazi kwenye tmux au screen.

Irun kama mtumiaji asiye na mamlaka, na uimarishe

Huduma inayojiendesha kama root inaweza kufanya lolote kwenye seva yako ikiwa programu itatumiwa vibaya. Irun kama mtumiaji wake mwenyewe, na upe systemd maelekezo machache ya kuizuia. Kwanza, tengeneza akaunti ya mfumo isiyo na uwezo wa kuingia na isiyo na nyumbani (home directory):

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp

Kisha weka User=myapp na uongeze mistari ya uimarishaji kwenye [Service]:

[Service]
User=myapp
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true

Kila mstari huondoa kitu ambacho programu haihitaji. NoNewPrivileges=true huizuia mchakato (process) kupata mamlaka mapya, hata kupitia binary ya setuid. PrivateTmp=true huipa /tmp ya siri ambayo hakuna mchakato mwingine unaoweza kuiona. ProtectSystem=strict hufanya mfumo mzima wa faili kuwa wa kusoma tu (read-only) isipokuwa njia chache utakazozitaja kwa ReadWritePaths=. ProtectHome=true huficha /home kwake kabisa. Hii ni mbinu sawa ya kutoa mamlaka madogo kama kuweka huduma nyuma ya firewall: mpe tu kile anachohitaji. Ikiwa umesoma mwongozo wa kufunga pengo la firewall la IPv6 kwenye VPS, hii ni sehemu ya ndani ya seva ya wazo lile lile. Kwa huduma inayokutana na mtandao, unganisha uimarishaji huu na Fail2ban mbele ya SSH na firewall ya default-deny.

Badala ya kuandika haya yote kwa mkono na kukosea maelekezo, tengeneza unit iliyoimarified kikamilifu na uinakili:

Toolsystemd service and timer generator

Timers: cron ya kisasa

Systemd timer huendesha huduma (service) kwa ratiba fulani, na ni mbadala wa kisasa wa cron job. Timer ina faili mbili: .service inayofanya kazi, na .timer inayosema lini. Kwa mfano, unataka kufanya backup kila siku saa 9 usiku. Huduma hiyo hufanya kazi mara moja na kufunga:

# /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

Type=oneshot huambia systemd kuwa programu inafanya kazi, inamaliza, na imekamilika, badala ya kubaki ikiwa imewashwa. Timer huipangia ratiba:

# /etc/systemd/system/backup.timer
[Unit]
Description=Run the nightly backup

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar=*-*-* 03:00:00 inamaanisha saa 9 usiku kila siku. Jaribu kielezi chochote cha kalenda kwa kutumia systemd-analyze calendar "*-*-* 03:00:00", ambayo inathibitisha ikiwa inasomika na kuonyesha muda ujao wa kufanya kazi. Persistent=true huendesha kazi iliyokosekana mara tu seva inapowaka ikiwa ilikuwa imezimwa saa 9 usiku, jambo ambalo cron haiwezi kufanya. Kumbuka kuwa timer huwashwa kupitia timers.target, si multi-user.target. Washa timer, si huduma (service):

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers

list-timers huonyesha timer zote pamoja na muda wa mwisho na ujao wa kufanya kazi, ili uweze kuona muda ujao wa kazi yako kwa haraka. Generator iliyo juu hutengeneza .service na .timer kwa ajili yako unapowasha timer mode. Tofauti na mstari wa cron, timer hukupa logi halisi kwenye journal, maelekezo ya ulinzi (hardening directives) kama huduma nyingine yoyote, na uwezo wa kukamilisha kazi iliyokosekana ambao Persistent=true hutoa. Cron bado ni nzuri kwa kazi rahisi; timer ni chombo bora zaidi pindi kazi hiyo inapokuwa muhimu.

FAQ

Tofauti kati ya systemd service na cron job ni ipi?

Service huweka programu inayojiendesha kwa muda mrefu ikiwa hai: huanza wakati wa boot, hujirudia ikifeli, na hurekodi logi kwenye journal. Cron job hutekeleza amri fupi kwa ratiba fulani kisha huisha. Unapotaka ratiba lakini pia unahitaji logi za journal, uimarishaji (hardening), na kuwahi kazi zilizokosekana, tumia systemd timer. Hii huunganisha ratiba ya .timer na service ya oneshot na huchukua nafasi ya cron kwa kazi nyingi za server.

Ni wapi nipoweke file langu la systemd service?

Weka unit zako kwenye /etc/systemd/system/, ukitumia jina linaloishia na .service. Directory hiyo ni kwa ajili ya unit ambazo msimamizi (administrator) huongeza, na ina kipaumbele kuliko unit zinazotoka kwenye package kwenye /lib/systemd/system/. Baada ya kutengeneza au kuhariri file hapo, run sudo systemctl daemon-reload ili systemd iweze kutambua mabadiliko hayo.

Ninawezaje kufanya service ijiirudishe iki crash?

Ongeza Restart=on-failure na RestartSec=5 kwenye sehemu ya [Service], kisha run sudo systemctl daemon-reload na uanzishe upya service hiyo. systemd huwasha upya programu inapofunga kwa kodi isiyo 0 au inapokufa kutokana na ishara ya crash, ikisubiri sekunde 5 kati ya majaribio. Ijaribu kwa kutumia sudo systemctl kill -s SIGKILL myapp.service — SIGTERM, ishara ya kawaida, inahesabiwa kama usitishaji safi na haichocheki on-failure — na uangalie systemctl status ionyeshe PID mpya ndani ya sekunde chache.

Ninawezaje kuendesha systemd service kama mtumiaji asiyeo kuwa root?

Tengeneza akaunti ya mfumo kwa kutumia sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp, kisha ongeza User=myapp kwenye sehemu ya [Service]. Ongeza NoNewPrivileges=true, PrivateTmp=true, na ProtectSystem=strict ili mchakato uendeshwe kwa ufikiaji mdogo zaidi unaohitajika. Kuendesha kama mtumiaji asiye na mamlaka ni mabadiliko muhimu zaidi unayoweza kufanya kwa usalama wa service.

Kwa nini service yangu imeshindwa kuanza?

Run systemctl status myapp.service kwa muhtasari na journalctl -u myapp.service kwa matokeo kamili. Sababu za kawaida ni njia (path) isiyo sahihi kwenye ExecStart, WorkingDirectory iliyokosekana, kosa la ruhusa kwa sababu User= haiwezi kusoma file, au sudo systemctl daemon-reload iliyosahaulika baada ya kuhariri. Journal huonyesha ujumbe wa kosa wa programu yenyewe, ambao mara nyingi hutaja tatizo moja kwa moja.