Systemd සේවාවේ stdout / stderr බලන්න


199

අභිරුචි යෙදුමක් සඳහා මම සරල systemd සේවා ගොනුවක් නිර්මාණය කර ඇත්තෙමි. මම එය අතින් ක්‍රියාත්මක කරන විට යෙදුම හොඳින් ක්‍රියාත්මක වේ, නමුත් මම එය systemd සමඟ ක්‍රියාත්මක කරන විට මගේ CPU උපරිම වේ.

මම උත්සාහ කරන්නේ මගේ ගැටලුව තිබෙන තැන සොයා ගැනීමටයි, නමුත් ප්‍රතිදානය කොහෙන්දැයි මම නොදනිමි (නැතහොත් ප්‍රතිදානය කොතැනක හෝ තැබීමට systemd වින්‍යාස කරන්නේ කෙසේද).

මෙන්න මගේ සේවා ගොනුව:

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target

යෙදුම පුරාම, මම stdout සහ stderr වෙත ප්‍රතිදානය කරමි.

මගේ ඩීමනයේ ප්‍රතිදානය කියවන්නේ කෙසේද?

සංස්කරණය කරන්න:

මම සොයා ගත්තා man systemd.exec, එහි StandardOutput=විකල්පය සඳහන් කර ඇත , නමුත් එය භාවිතා කරන්නේ කෙසේදැයි මට විශ්වාස නැත. සිට man පිටුව :

StandardOutput=

ක්‍රියාත්මක කරන ලද ක්‍රියාවලි වල ගොනු විස්තර 1 (STDOUT) සම්බන්ධ කර ඇති පාලක. එක් ගනී උරුම , ශූන්ය , tty වෙත , syslog , kmsg , kmsg + කොන්සෝලය , syslog + කොන්සෝලය හෝ සොකට් .

සම්මත ආදානයේ ගොනු විස්තරය උරුම කර ගැනීමට සකසා ඇත්නම් සම්මත ප්‍රතිදානය සඳහා අනුපිටපත් කරනු ලැබේ. සම්මත ප්‍රතිදානය ශුන්‍ය ලෙස සකසා ඇත්නම් /dev/null, එනම් එයට ලියා ඇති සියල්ල නැති වී යයි. කිරීමට හැකි නම්, tty වෙත සම්මත ප්රතිදානය tty වෙත සම්බන්ධ කිරීමට නියමිතය (මාන ලෙස TTYPath=, පහත බලන්න). TTY ප්‍රතිදානය සඳහා භාවිතා කරන්නේ නම්, ක්‍රියාත්මක කරන ලද ක්‍රියාවලිය පමණක් පර්යන්තයේ පාලන ක්‍රියාවලිය බවට පත් නොවන අතර, ටර්මිනලය මුදා හැරීමට වෙනත් ක්‍රියාදාමයන් අසමත් නොවනු ඇත. syslog සම්මත ප්‍රතිදානය syslog (3) පද්ධති ලොගර් සමඟ සම්බන්ධ කරයි. kmsg එය dmesg (1) හරහා ප්‍රවේශ විය හැකි කර්නල් ලොග් බෆරය සමඟ සම්බන්ධ කරයි. syslog + console සහ kmsg + consoleඒ හා සමානව ක්‍රියා කරන නමුත් ප්‍රතිදානය පද්ධති කොන්සෝලය වෙත පිටපත් කරන්න. සොකට් සක්‍රිය කිරීමෙන් සොකට් එකකට සම්මත ප්‍රතිදානය සම්බන්ධ කරයි, අර්ථ නිරූපණය අදාළ විකල්පයට සමාන වේ StandardInput=. මෙම සැකසුම පෙරනිමියෙන් උරුම වේ.

මෙයින් අදහස් කරන්නේ මේවා මගේ එකම විකල්පයන් බවයි? උදාහරණයක් ලෙස, ප්‍රතිදානය /dev/shmහෝ වෙනත් දෙයක් දැමීමට මම කැමතියි . මම සිතන්නේ මට යුනික්ස් ඩොමේන් සොකට් එකක් භාවිතා කර සරල සවන්දෙන්නෙකු ලිවිය හැකි නමුත් මෙය ටිකක් අනවශ්‍ය බව පෙනේ.

නිදොස් කිරීම සඳහා මට මෙය අවශ්‍ය වන අතර, බොහෝ විට මම බොහෝ ල logs ු-සටහන් ඉවත් කර ප්‍රතිදානය සයිස්ලොග් ලෙස වෙනස් කරමි.


/var/log/syslogප්‍රතිදානය පරීක්ෂා කිරීමට ඔබ උත්සාහ කර තිබේද? බොහෝ පද්ධති මඟින් දේවල් ලොග් වනු ඇත, /var/log/එබැවින් මම එහි පරීක්ෂා කිරීමෙන් ආරම්භ කරමි. grepප්‍රතිදානය ඔබ දන්නේ නම් ඔබට පෙළ සෙවීමට භාවිතා කළ හැකිය : grep "my output" /var/logඋපක්‍රමය කළ යුතුය.
sbtkd85

@ sbtkd85 - හොඳයි, මා සතුව නැත /var/log/syslog, නමුත් /var/log/messagesඋපක්‍රමය කරයි. ගැටළුව වන්නේ, ල logs ු-සටහන් වලට අනුව, මගේ ඩීමන් ආරම්භයේදීම බිඳ වැටෙන නමුත්, එය HTTP සේවාදායකයක් ඇති බැවින් එය තවමත් ක්‍රියාත්මක වන බව මට පැවසිය හැකිය, මට එය විමසිය හැකිය. පෙනෙන ආකාරයට ඉතිරි ල
logs ු

StandardOutput=ttyඔබේ ඩීමන් දියත් කරන විට සිදුවන්නේ කුමක්දැයි බැලීමට සැකසීමට උත්සාහ නොකරන්නේ මන්ද? එය ටර්මිනලය ප්‍රතිදානය කළ යුතුය ( ttyS0ඔබේ තිරය මත ප්‍රතිදානය ලබා ගැනීමට ඔබට භාවිතා කිරීමට හෝ ඒ හා සමාන විය හැකිය).
sbtkd85

3
මෙම සන්දර්භය තුළ සම්මත IO යළි-යොමුවීම් ක්‍රියාකරුවන් ක්‍රියා නොකළ යුතුය. වැනි දෙයක්ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
දීපක් මිට්ටාල්

ඇත්ත වශයෙන්ම ඔබේ CPU අපයෝජනය කරන්නේ කුමක්ද? එය systemd ද, ඔබේ සේවාව හෝ පද්ධතියද (උදා: systemd පිස්සු වැටී ඇති නිසා සේවාවේ නව පිටපත් බිහි කිරීමෙන්)?
පීටර්ෆ්

Answers:


205

යාවත්කාලීන කරන්න

මයික්මැකානා සටහන් කරන පරිදි, systemd ජර්නලය දැන් බොහෝ ඩිස්ට්‍රෝ සඳහා සම්මත ල ging ු-සටහන් උපාංගය වේ. stdoutසහ stderrsystemd ඒකකයක් බැලීමට සහ විධානය භාවිතා කරන්න journalctl.

sudo journalctl -u [unit]

මුල් පිළිතුර

පෙරනිමියෙන් stdoutසහ stderrsystemd ඒකකයක් syslog වෙත යවනු ලැබේ.

ඔබ සම්පූර්ණ systemd භාවිතා කරන්නේ නම්, මෙය හරහා ක්‍රියාත්මක journalctlවේ. ෆෙඩෝරා හි එය එසේ විය යුතු /var/log/messagesනමුත් ඔබේ නීති රීති පවසන තැන සයිස්ලොග් එය තබයි.

පළ කිරීමේ දිනය නිසා, සහ systemd නිරාවරණය කරන බව බොහෝ මිනිසුන් ෆෙඩෝරා හරහා, ඔබ බොහෝ විට දෝෂ එල්ල විය පවරාගෙන මෙහි විස්තර: https://bugzilla.redhat.com/show_bug.cgi?id=754938 එය ඇත ඒ සියල්ල ද ක්රියා කරන ආකාරය =) (මෙම නිසා දෝෂ පණිවිඩ ලොගින් වී බව කිරීම නොව, සහ ස්ථාවර විය SELinux ප්රතිපත්තිය සහ දෝෂයක් විය හොඳ පැහැදිලි කිරීමක් selinux-policy-3.10.0-58.fc16)


5
මේ ආකාරයට සම්මත ල ging ු-සටහන් යාන්ත්‍රණය භාවිතා කිරීමෙන් පෙරනිමියෙන් අඛණ්ඩ ලොග් නිර්මාණය නොවන බව සලකන්න . එය සිදු කිරීම සඳහා, ඔබට / var / log / sudo systemctl restart systemd-journald
magazine

1
කුමන සිස්ලොග් පහසුකම සහ ප්‍රමුඛතාවය?
jrwren

2
මේ මට වැඩ: StandardOutput=syslog+consoleහා StandardError=syslog+consoleපසු මගේ ඒකකය සියලු ප්රතිදානය journalctl පෙනී සිටියහ. පෙරනිමි සැකසුම වැරදිය. (/Etc/systemd/system.conf හි DefaultStandardOutput වැනි)
gregn3

2
-fමට ප්‍රයෝජනවත් විය. වෙනස්කම් සිදු වන විට ලොගය අනුගමනය කළේය (භාවිත නඩුව ඩීමන් ලෙස ක්‍රියාත්මක වන
Minecraft

3
මෙය මා පිස්සු වට්ටයි ... සම්මත ඩේබියන් ස්ට්‍රෙච් ජර්නල්ක්ල් විසින් සම්මත ප්‍රතිදානයන් කිසිවක් මට නොපෙන්වයි. මම භාවිතා /usr/bin/stdbuf -oL <cmd>හා පැහැදිලි StandardOutput=journal. තවමත් කිසිවක් නැත.
jlh

91

කෙටි, සරල, උරුමය නොවන පිළිතුර:

sudo journalctl -u [unitfile]

[Unitfile] යනු systemd .serviceනාමයයි. උදා, වෙතින් පණිවිඩ බැලීමට myapp.service,

sudo journalctl --unit=myapp

තථ්‍ය කාලය තුළ ලොග් අනුගමනය කිරීමට:

sudo journalctl -f -u myapp

4
ඔබට දෝෂයක් ඇති sudoවුවහොත් ඔබට සිදු විය හැකි බව සලකන්න No journal files found.
bigjosh

6
syslog උරුමයක් නොවේ ...
මයිල්ස් රූට්

2
එය වර්තමාන ලිනක්ස් ඩිස්ට්‍රෝස් වල ඇත. ඔබ සැබවින්ම සිස්ලොග් වලට කැමති විය හැකි නමුත් එය ඔවුන් නැව්ගත කරන දේ වෙනස් නොකරයි.
mikemaccana

1
ෂුවර්. තවද එය syslog ද භාවිතා කරයි. මගේ අදහස වූයේ systemd භාවිතා නොකරන බව නොවේ, නමුත් එම syslog උරුමය නොවේ.
labyrinth

9
LJECompton වර්තමාන ලිනක්ස් ඩිස්ට්‍රෝස් හි සියලුම ලොග් වීම ජර්නල් භාවිතා කරන්නේ නම් සහ සයිස්ලොග් අවශ්‍ය නොවන අතර අනුකූලතාව සඳහා පමණක් භාවිතා කරයි නම්, එය තාර්කිකව අනුගමනය කරන්නේ සයිස්ලොග් උරුමයයි.
mikemaccana
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.