systemd என்றால் என்ன: எப்படி வேலை செய்கிறது, லினக்ஸில் சேவைகளை நிர்வகிப்பது
systemd என்பது லினக்ஸின் துவக்க (init) அமைப்பு மற்றும் சேவை மேலாளர்: கர்னல் இதை முதல் செயல்முறையாக (PID 1) இயக்குகிறது; பின்னர் இது மற்ற சேவைகளை சரியான வரிசையில் தொடங்கி கண்காணிக்கிறது. systemd நிர்வகிக்கும் அனைத்தும் units ஆக விவரிக்கப்படுகின்றன — சேவைகள், டைமர்கள், ஏற்றுப் புள்ளிகள்; அவற்றை systemctl மூலம் தொடங்கலாம், நிறுத்தலாம், தானியங்கி தொடக்கத்தில் சேர்க்கலாம்; அவற்றின் பதிவுகளை journalctl காட்டும்.
systemd என்பது துவக்க அமைப்பு மற்றும் சேவை மேலாளர்; Debian, Ubuntu, Fedora, RHEL மற்றும் அவற்றின் வழித்தோன்றல்கள் பெரும்பாலானவற்றில் இது பயன்படுகிறது. துவக்கத்துக்குப் பின் கர்னல் systemd-ஐ PID 1 எண் கொண்ட முதல் செயல்முறையாக இயக்குகிறது; பின்னர் systemd பிணையத்தைத் தொடங்குகிறது, வட்டுகளை ஏற்றுகிறது, இணைய சேவையகம், தரவுத்தளம் மற்றும் மற்ற அனைத்து சேவைகளையும் தொடங்குகிறது. சுருக்கமாகச் சொன்னால், "systemd என்றால் என்ன" என்பதற்கான பதில்: எந்தச் சேவைகள் இயங்க வேண்டும், எந்த வரிசையில் தொடங்க வேண்டும், ஒரு சேவை தோல்வியடைந்தால் என்ன செய்ய வேண்டும் என்பதை அறியும் "மேலாளர்".
உங்கள் அமைப்பில் systemd உள்ளதா என்று உறுதிசெய்வது எளிது:
$ ps -p 1 -o comm=
systemd
systemd ஏன் உருவாக்கப்பட்டது
முன்பு லினக்ஸ் SysV init-ஐப் பயன்படுத்தியது: /etc/init.d/-இல் உள்ள ஷெல் ஸ்கிரிப்ட்களின் தொகுப்பு, அவை ஒன்றன் பின் ஒன்றாக இயங்கின. அந்த முறை புரிந்துகொள்ள எளிதாக இருந்தாலும் மெதுவாகவும் நிலையற்றதாகவும் இருந்தது. ஒவ்வொரு ஸ்கிரிப்டும் தனது PID கோப்பை எழுதியது, செயல்முறை உயிருடன் இருக்கிறதா என்பதை அது தானே முடிவுசெய்தது, தோல்வியடைந்த சேவையை மீண்டும் தொடங்குவது தனியாகச் சேர்க்கப்பட வேண்டியிருந்தது.
systemd இந்தச் சிக்கல்களை மையமாகத் தீர்க்கிறது:
- இணையான தொடக்கம். சார்புகள் இல்லாத சேவைகள் ஒன்றாகத் தொடங்கும், எனவே துவக்கம் வேகமாக நடக்கும்.
- சார்புகளும் வரிசையும். சேவையின் விளக்கத்தில் அதற்குத் தேவையானவை (எ.கா. பிணையம்) மற்றும் அதற்குப் பின் தொடங்க வேண்டியவை தெளிவாகக் குறிப்பிடப்படுகின்றன.
- கண்காணிப்பு. systemd cgroups மூலம் சேவையின் அனைத்து செயல்முறைகளையும் அறியும்; தோல்வியில் அதை மீண்டும் தொடங்கலாம்.
- ஒரே பதிவு. எல்லா சேவைகளின் வெளியீட்டை journald சேகரிக்கிறது; ஒரே கட்டளையில் படிக்கலாம்.
- ஒரே இடைமுகம். ஒவ்வொரு சேவையும் ஒரே வழியில் நிர்வகிக்கப்படுகிறது:
systemctl start|stop|restart|status.
சேவை மேலாளருக்கு அப்பால், systemd திட்டத்தில் வேறு கூறுகளும் உள்ளன: journald (பதிவு), logind (பயனர் அமர்வுகள்), timesyncd (நேர ஒத்திசைவு), resolved (DNS), networkd (பிணையம்). எல்லா விநியோகங்களும் அனைத்தையும் பயன்படுத்துவதில்லை; ஆனால் PID 1 ஆக systemd-உம் journald-உம் கிட்டத்தட்ட எல்லா இடங்களிலும் உண்டு.
Units: systemd-இன் கூறுகள்
systemd நிர்வகிக்கும் அனைத்தும் units மூலம் விவரிக்கப்படுகின்றன. Unit என்பது INI வடிவமைப்பிலுள்ள உரைக் கோப்பு; அதன் வகை நீட்சியால் (extension) தீர்மானிக்கப்படுகிறது.
| வகை | நீட்சி | விவரிப்பது |
|---|---|---|
| service | .service | சேவை — டீமன் செயல்முறை அல்லது ஒருமுறை பணி |
| timer | .timer | அட்டவணைப்படி வேறொரு unit-ஐ இயக்குதல் (cron-க்கு மாற்று) |
| socket | .socket | இணைப்பு வந்ததும் சேவையைத் தொடங்கும் socket |
| target | .target | units-இன் குழு, அதாவது "அமைப்பின் நிலை" (எ.கா. multi-user.target) |
| mount | .mount | ஏற்றுப் புள்ளி (mount point) |
| path | .path | கோப்பு அல்லது கோப்பகத்தைக் கண்காணித்தல் |
unit கோப்புகள் எங்கே இருக்கின்றன
Unit கோப்புகள் பல கோப்பகங்களில் இருக்கின்றன; ஒவ்வொன்றுக்கும் முன்னுரிமை உண்டு:
/usr/lib/systemd/system/(Debian மற்றும் Ubuntu-வில்/lib/systemd/system/-உம்) — தொகுப்புகளால் நிறுவப்பட்ட units. நேரடியாகத் திருத்தாதீர்கள்: தொகுப்பு புதுப்பிக்கப்பட்டால் உங்கள் மாற்றங்கள் அழிந்துவிடும்./etc/systemd/system/— நிர்வாகியின் units மற்றும் மேலெழுதல்கள். இதற்கு அதிக முன்னுரிமை./run/systemd/system/— அமைப்பு இயங்கும்போது உருவாக்கப்படும் தற்காலிக units.
எல்லா மேலெழுதல்களுடன் unit-இன் இறுதி உள்ளடக்கத்தைப் பார்க்க systemctl cat nginx.service பயன்படுத்துங்கள்.
runlevel-களுக்குப் பதில் targets
பழைய runlevel-களுக்குப் பதில் targets வந்துவிட்டன. multi-user.target வரைகலை இல்லாத வழக்கமான சேவையக முறை; graphical.target வரைகலை இடைமுகத்துடன்; rescue.target ஒரு பயனர் மீட்பு முறை. இயல்புநிலை target-ஐ systemctl get-default காட்டும்; systemctl set-default multi-user.target மூலம் மாற்றலாம்.
systemctl: சேவைகளைக் கட்டுப்படுத்துதல்
systemctl systemd-உடன் வேலை செய்வதற்கான முதன்மைக் கருவி. பெரும்பாலான கட்டளைகள் அமைப்பின் நிலையை மாற்றுகின்றன, அதற்கு sudo தேவை.
| கட்டளை | பயன் |
|---|---|
systemctl status nginx | சேவையின் நிலை, PID, நினைவகம், கடைசிப் பதிவு வரிகள் |
systemctl start nginx | இப்போதே தொடங்கு |
systemctl stop nginx | நிறுத்து |
systemctl restart nginx | மறுதொடக்கம் (stop + start) |
systemctl reload nginx | நிறுத்தாமல் உள்ளமைவை மீண்டும் படி (சேவை ஆதரித்தால்) |
systemctl enable nginx | தானியங்கி தொடக்கத்தை இயக்கு |
systemctl disable nginx | தானியங்கி தொடக்கத்தை நிறுத்து |
systemctl enable --now nginx | தானியங்கி தொடக்கத்தை இயக்கி, உடனே தொடங்கு |
systemctl is-active nginx | active/inactive என்று காட்டும் — ஸ்கிரிப்ட்டுகளுக்குப் பயனுள்ளது |
systemctl list-units --type=service | ஏற்றப்பட்ட சேவைகள் |
systemctl --failed | தோல்வியடைந்த units |
systemctl daemon-reload | திருத்திய பின் unit கோப்புகளை மீண்டும் படி |
systemctl status-ஐ எப்படிப் படிப்பது
$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-10-12 09:14:03 UTC; 2h 5min ago
Docs: man:nginx(8)
Main PID: 812 (nginx)
Tasks: 3 (limit: 2307)
Memory: 6.1M
CPU: 154ms
CGroup: /system.slice/nginx.service
├─812 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
├─813 "nginx: worker process"
└─814 "nginx: worker process"
Loaded வரி unit எங்கிருந்து எடுக்கப்பட்டது, தானியங்கி தொடக்கம் இயக்கத்தில் உள்ளதா (enabled) என்பதைக் காட்டுகிறது. Active வரி தற்போதைய நிலை: active (running), inactive (dead) அல்லது failed. CGroup பகுதி சேவையின் அனைத்து செயல்முறைகளையும் காட்டுகிறது — systemd எந்த செயல்முறை தனக்குரியது என்று இப்படித்தான் அறிகிறது.
enable மற்றும் start வேறுபாடு
இது அடிக்கடி குழப்பும். start சேவையை இப்போதே தொடங்குகிறது, ஆனால் மறுதுவக்கத்துக்குப் பின் அது எழாது. enable target கோப்பகத்தில் குறியீட்டு இணைப்பு உருவாக்குகிறது (எ.கா. /etc/systemd/system/multi-user.target.wants/), எனவே துவக்கத்தில் சேவை எழும்; ஆனால் இப்போது இயங்காது. பொதுவாக இரண்டும் தேவை — enable --now பயன்படுத்துங்கள்.
மூன்றாவது நிலையும் உண்டு: mask. systemctl mask service unit-ஐ /dev/null-உடன் இணைக்கிறது; அதனால் அதை கைமுறையாகவோ சார்புநிலையாகவோ இயக்க முடியாது. சேவையை முழுமையாக நிறுத்தி வைக்க வேண்டியபோது இது பயனுள்ளது.
journalctl: சேவைப் பதிவுகள்
சேவை stdout மற்றும் stderr-இல் எழுதும் அனைத்தையும் systemd-journald பிடித்து, unit பெயர், PID, முன்னுரிமை, நேரம் ஆகிய மெட்டாடேட்டாவுடன் ஒரு binary பதிவில் சேமிக்கிறது. அதைப் படிக்க journalctl.
journalctl -u nginx # ஒரு சேவையின் பதிவு
journalctl -u nginx -f # நேரடியாகப் பின்தொடர், tail -f போல
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx -n 50 # கடைசி 50 வரிகள்
journalctl -b # நடப்பு துவக்கத்திலிருந்து
journalctl -b -1 # முந்தைய துவக்கம்
journalctl -p err -b # பிழைகள் மற்றும் அதற்கு மேற்பட்டவை மட்டும்
journalctl -k # கர்னல் செய்திகள்
journalctl --disk-usage # பதிவு எவ்வளவு இடம் பிடிக்கிறது
-p விருப்பம் syslog முன்னுரிமைப்படி வடிகட்டுகிறது: emerg, alert, crit, err, warning, notice, info, debug. குறிப்பிட்ட நிலை அதைவிட தீவிரமான அனைத்தையும் உள்ளடக்கும்.
மறுதுவக்கத்துக்குப் பிறகும் பதிவு
/var/log/journal கோப்பகம் இல்லாமலும் /etc/systemd/journald.conf-இல் Storage=auto இருந்தாலும், பதிவு நினைவகத்தில் மட்டுமே (/run/log/journal) இருக்கும்; மறுதுவக்கத்தில் அழிந்துவிடும். நிரந்தரமாக்க Storage=persistent அமைக்கவும், அல்லது கோப்பகத்தை உருவாக்கி journald-ஐ மீண்டும் தொடங்கவும். அளவை SystemMaxUse= கட்டுப்படுத்தும்; பழைய தரவை journalctl --vacuum-time=2weeks அல்லது --vacuum-size=500M மூலம் அழிக்கலாம்.
journald பெரும்பாலும் rsyslog-உடன் வேலை செய்கிறது: journal செய்திகளை rsyslog-க்கு அனுப்புகிறது; rsyslog /var/log/-இல் பாரம்பரிய உரைக் கோப்புகளை எழுதுகிறது, மேலும் பதிவுகளை மையச் சேவையகத்துக்கு அனுப்பலாம்.
உங்கள் சேவையை தானாகத் தொடங்குதல்: unit file எடுத்துக்காட்டு
உங்களிடம் ஒரு பயன்பாடு இருப்பதாக வைத்துக்கொள்ளுங்கள் — ஒரு ஸ்கிரிப்ட் அல்லது binary — அது எப்போதும் இயங்க வேண்டும், துவக்கத்தில் எழ வேண்டும், செயலிழந்தால் மீண்டும் தொடங்க வேண்டும். /etc/systemd/system/myapp.service கோப்பை உருவாக்குங்கள்:
[Unit]
Description=My web application
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
EnvironmentFile=/etc/myapp/env
ExecStart=/opt/myapp/bin/server --port 8080
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
பகுதிகளை இப்படிப் புரிந்துகொள்ளுங்கள்:
- [Unit] — விளக்கமும் சார்புகளும்.
After=வரிசையை மட்டும் தீர்மானிக்கிறது;Wants=மென்மையான சார்பு (unit-ஐ இழுத்துவரும், ஆனால் அது எழாவிட்டால் தோல்வியடையாது). கடுமையான சார்புRequires=. - [Service] — எப்படி இயக்குவது.
Type=simpleஎன்றால்ExecStart-இன் செயல்முறையே சேவை, அது பின்னணிக்குச் செல்லாது.User=சலுகையற்ற பயனராக இயக்குகிறது.Restart=on-failureபிழையுடன் முடிந்தால்RestartSecவினாடிகளுக்குப் பின் மீண்டும் தொடங்கும். - [Install] —
enableஎன்ன செய்கிறது.WantedBy=multi-user.targetஎன்றால் "வழக்கமான துவக்கத்தில் இயக்கு".
பயன்படுத்துதல்:
sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
systemctl status myapp
journalctl -u myapp -f
unit file-இல் பொதுவான தவறுகள்
- ExecStart-இல் தொடர்புடைய பாதை. நிரலுக்கான பாதை முழுமையானதாக இருக்க வேண்டும். systemd பயனரின்
PATH-இல் ஷெல் போல கட்டளைகளைத் தேடாது. - daemon-reload மறந்துவிடுவது. கோப்பைத் திருத்திய பின் systemd பழைய பதிப்பையே பயன்படுத்துகிறது;
status-இல் எச்சரிக்கை தோன்றும். - டீமன் பின்னணிக்குச் செல்வது. நிரல் தானே fork செய்தாலும்
Type=simpleஎன்று எழுதியிருந்தால், systemd சேவை முடிந்துவிட்டது என்று நினைக்கும். நிரலை முன்னணி (foreground) முறையில் இயக்குங்கள், அல்லதுPIDFile=-உடன்Type=forkingபயன்படுத்துங்கள். - சுயவிவரச் சூழல் மாறிகள். சேவை
~/.bashrcஅல்லது/etc/profile-ஐப் படிக்காது. மாறிகளைEnvironment=அல்லதுEnvironmentFile=மூலம் கொடுக்க வேண்டும்.
தொகுப்பின் unit-ஐத் தொடாமல் மேலெழுதுதல்
தொகுப்பிலுள்ள சேவையின் அளவுருக்களை அதன் கோப்பைத் தொடாமல் மாற்ற drop-in பயன்படுத்துங்கள்:
sudo systemctl edit nginx
ஒரு எடிட்டர் திறக்கும்; மாற்றங்கள் /etc/systemd/system/nginx.service.d/override.conf-இல் சேமிக்கப்படும். எடுத்துக்காட்டாக அங்கே [Service] கீழ் Restart=always எழுதலாம். எடிட்டரை மூடியவுடன் systemd உள்ளமைவை மீண்டும் படிக்கும்.
cron-க்குப் பதில் systemd timer
Timer என்பது அதே பெயரிலுள்ள சேவையை அட்டவணைப்படி இயக்கும் unit. cron-ஐவிட இதன் நன்மைகள்: பணியின் பதிவுகள் journal-இல் இருக்கும், சார்புகளை வைக்கலாம், தவறிய இயக்கங்களை ஈடுசெய்யலாம் (Persistent=true). தினசரி காப்புப் பிரதியின் எடுத்துக்காட்டு:
# /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers
OnCalendar வெளிப்பாட்டைச் சரிபார்க்க systemd-analyze calendar "*-*-* 03:00:00" — அடுத்த இயக்க நேரத்தைக் காட்டும்.
துவக்கக் கண்டறிதல்
systemd ஒவ்வொரு unit-உம் தொடங்கிய நேரத்தைச் சேமிக்கிறது; அதனால் மெதுவான துவக்கத்தை எளிதாக ஆய்வு செய்யலாம்:
systemd-analyze # மொத்த துவக்க நேரம்
systemd-analyze blame # units தொடங்கிய நேரத்தின்படி
systemd-analyze critical-chain # துவக்கத்தைத் தாமதப்படுத்தும் சங்கிலி
systemd-analyze verify /etc/systemd/system/myapp.service # unit file-ஐச் சரிபார்
சுருக்கம்
systemd நவீன லினக்ஸின் PID 1 மற்றும் சேவை மேலாளர். அது அனைத்தையும் units மூலம் விவரிக்கிறது, systemctl மூலம் கட்டுப்படுத்தப்படுகிறது, பதிவுகளை journalctl படிக்கும் journal-இல் சேமிக்கிறது, cron-க்குப் பதில் timers மூலம் பணிகளை இயக்கலாம். இதைத் நம்பிக்கையுடன் பயன்படுத்த status, enable --now, journalctl -u, மற்றும் Restart=on-failure-உடன் எளிய unit file எழுதும் திறன் போதும். systemd, journald மற்றும் பதிவு செய்தல் லினக்ஸ் பாடநெறியில் நடைமுறையுடன் கற்பிக்கப்படுகின்றன.
அடிக்கடி கேட்கப்படும் கேள்விகள்
என் அமைப்பு systemd-ஐப் பயன்படுத்துகிறதா என்று எப்படித் தெரிந்துகொள்வது?
ps -p 1 -o comm= இயக்குங்கள் — வெளியீடு systemd என்றால் அமைப்பு systemd மூலம் இயங்குகிறது. /run/systemd/system கோப்பகமும் systemd மூலம் துவக்கும்போது மட்டுமே இருக்கும்.
systemctl restart மற்றும் reload வேறுபாடு என்ன?
restart சேவையை முழுமையாக நிறுத்தி மீண்டும் தொடங்குகிறது; இணைப்புகள் துண்டிக்கப்படும். reload சேவையை நிறுத்தாமல் உள்ளமைவை மீண்டும் படிக்கச் சொல்கிறது; ஆனால் unit-இல் ExecReload இருந்தால் மட்டுமே வேலை செய்யும்.
systemd சேவைகளை sudo இல்லாமல் சாதாரண பயனர் இயக்க முடியுமா?
முடியும்; systemd-க்கு பயனர் நிகழ்வு உண்டு: unit-ஐ ~/.config/systemd/user/-இல் வைத்து systemctl --user மூலம் நிர்வகிக்கலாம். செயல்படும் அமர்வு இல்லாமலும் இயங்க, அந்தப் பயனருக்கு loginctl enable-linger இயக்குங்கள்.
சேவை failed நிலையில் இருப்பது ஏன், அதை எப்படி மீட்டமைப்பது?
காரணத்தை journalctl -u பெயர் -b மற்றும் status-இல் உள்ள Active வரியில் தேடுங்கள். பிரச்சினையைச் சரிசெய்து சேவையை மீண்டும் தொடங்குங்கள்; failed குறியை systemctl reset-failed அழிக்கும்.
systemd பதிவுகள் வட்டில் எங்கே சேமிக்கப்படுகின்றன?
நிரந்தர சேமிப்பு இயக்கத்தில் இருந்தால் /var/log/journal/-இல் binary வடிவில்; இல்லையென்றால் /run/log/journal/-இல் நினைவகத்தில். அவற்றை உரைக் கருவிகளால் அல்ல, journalctl மூலம் படிக்க வேண்டும்.
“Linux: с нуля до уверенного администрирования” பாடநெறியில் இந்தத் தலைப்பு பயிற்சியுடன் விரிவாக விளக்கப்பட்டுள்ளது.
- systemd: как на самом деле запускаются сервисы в современном Linux
- Журналы и мониторинг: journald, rsyslog и sysstat