ฉันจะดูได้อย่างไรว่าเซอร์วิส systemd เริ่มทำงาน / หยุด / รีสตาร์ทแล้ว?


12

ฉันมีบริการ (เขียนด้วยตัวเอง) ที่ทำงานบนเซิร์ฟเวอร์ Debian (Jessie) และมีบันทึกของตัวเองบริการเพื่อแสดงว่าเริ่มต้นใหม่ในเวลาใดเวลาหนึ่ง ไม่มีข้อบ่งชี้ของ segfault หรือความผิดพลาดอื่น ๆ ดังนั้นตอนนี้ฉันกำลังพยายามคิดออกว่าแอปพลิเคชันใดๆ ที่ล้มเหลวอย่างเงียบ ๆและได้รับการตอบกลับจาก systemd หรือไม่ว่าผู้ใช้บริการเริ่มต้นใหม่โดยsystemctlตั้งใจ

ประวัติเชลล์ไม่แสดงกิจกรรมดังกล่าว แต่ไม่ได้ข้อสรุปเนื่องจากexport HISTCONTROL=ignorebothและเนื่องจากเซสชัน SSH อาจเพิ่งหมดเวลาเพื่อป้องกันไม่ให้ประวัติทุบตีของล็อกอินก่อนหน้านี้ถูกเขียนลงดิสก์ เซิร์ฟเวอร์ไม่รีบูตในเวลานั้น

แต่ฉันคาดหวังว่า systemd เองควรเก็บบันทึกที่ระบุเมื่อเริ่มบริการใหม่โดยมีจุดประสงค์ ด้วยความประหลาดใจของฉันฉันไม่สามารถค้นหาเอกสารใด ๆ (เช่นเพื่อjournalctl) เกี่ยวกับวิธีรับบันทึกดังกล่าว

บางโพสต์อื่น ๆ (เช่นที่ไหน / ทำไมไม่มีบันทึกสำหรับผู้ใช้บริการ systemd ปกติ? ) ดูเหมือนจะระบุว่าควรมีข้อความบันทึกเช่นนี้:

Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Starting chatty.service...
Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Started chatty.service.

แต่ฉันไม่เห็นข้อความบันทึกดังกล่าวในระบบของฉัน

มีวิธีที่จะทราบว่าบริการ systemd เริ่มหยุดหรือเริ่มใหม่ได้หรือไม่?

แก้ไข : ดูเหมือนว่าปัญหาที่คนทั่วไปอาจพบคือพวกเขาทำงานjournalctlในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษ นี่ไม่ใช่กรณีสำหรับฉันฉันได้รับการดำเนินงานrootตลอดเวลา ในการตอบกลับความคิดเห็นการทำงานgrep systemd /var/log/syslogให้ฉันเพียงแค่นี้:

Jun  6 09:28:35 server systemd[22057]: Starting Paths.
Jun  6 09:28:35 server systemd[22057]: Reached target Paths.
Jun  6 09:28:35 server systemd[22057]: Starting Timers.
Jun  6 09:28:35 server systemd[22057]: Reached target Timers.
Jun  6 09:28:35 server systemd[22057]: Starting Sockets.
Jun  6 09:28:35 server systemd[22057]: Reached target Sockets.
Jun  6 09:28:35 server systemd[22057]: Starting Basic System.
Jun  6 09:28:35 server systemd[22057]: Reached target Basic System.
Jun  6 09:28:35 server systemd[22057]: Starting Default.
Jun  6 09:28:35 server systemd[22057]: Reached target Default.
Jun  6 09:28:35 server systemd[22057]: Startup finished in 59ms.
Jun  6 09:37:08 server systemd[1]: Reexecuting.

"ไม่เห็นข้อความบันทึกดังกล่าว" - แปลกใช่ไหม ฉันมีจำนวนมากในgrep systemd /var/log/syslog
hschou

ในระบบของฉันฉันเห็นข้อความทั่วไปมากเช่นStopped target Default, Starting Shutdownฯลฯ ไม่มีอะไรบ่งบอกอะไรเกี่ยวกับการบริการส่วนบุคคล อาจเป็นเพียงปัญหาการกำหนดค่าหรือไม่ หมายเหตุฉันใช้ Debian Jessie ในกรณีนี้โดยเฉพาะ
mindriot

ตรวจสอบของคุณ/etc/systemd/journald.confยังไม่ได้แทนที่MaxLevelStoreหรือMaxLevelSyslogและมองในทุกสถานที่อื่น ๆ ที่คุณสามารถกำหนดค่า journald man journald.confที่ระบุไว้ใน
meuh

ขอบคุณสำหรับทิป. น่าเสียดายที่ไฟล์กำหนดค่าทั้งหมดที่อยู่ unter /etc/systemdนั้นว่างเปล่าเป็นหลัก (ตัวเลือกทั้งหมดใส่ความคิดเห็นรวมถึงไฟล์ที่คุณกล่าวถึง)
mindriot

คำตอบ:


11

หากคุณต้องการสคริปต์นี้คุณควรตรวจสอบการใช้systemctl show คำสั่ง statusมันเป็นประโยชน์มากสำหรับสคริปต์กว่าพยายามที่จะแยกจากอะไร ตัวอย่างเช่นหากต้องการค้นหาว่าเมื่อใดที่บริการเริ่มต้นครั้งล่าสุดคุณสามารถใช้:

$ systemctl show systemd-journald --property=ActiveEnterTimestamp
ActiveEnterTimestamp=Wed 2017-11-08 05:55:17 UTC

หากคุณต้องการที่จะเห็นคุณสมบัติทั้งหมดที่มีอยู่เพียงแค่ละเว้นธงและมันจะทิ้งพวกเขาทั้งหมด

$ systemctl show <service_name>

เอกสารสำหรับคุณสมบัติเหล่านี้สามารถพบได้ที่นี่


น่าสนใจฉันไม่ทราบคุณสมบัติ น่าเสียดายที่มีการตั้งค่าไว้เหมือนกันไม่ว่าบริการจะล้มเหลวและเกิดขึ้นซ้ำหรือบริการถูกรีสตาร์ทโดยผู้ใช้
mindriot

1
โดยวิธีการเชื่อมโยงที่ดีกว่าสำหรับคุณสมบัติที่ดูเหมือนว่าจะเป็นเอกสาร dbus
mindriot

ขอบคุณ @indriot ที่เป็นลิงค์ที่ดีกว่าสำหรับเอกสารฉันได้อัปเดตคำตอบของฉันแล้ว
jdf

1
@mindriot เกี่ยวกับประเด็นแรกของคุณแม้ว่าคุณได้ตรวจสอบStatusErrnoและResult? ฉันจะสงสัยว่าการเปลี่ยนแปลงเหล่านั้นถ้าบริการล้มเหลวหรือถูกเริ่มใหม่ หากคุณต้องการดำเนินการต่อลองเพิ่มExecStopPostขั้นตอนที่คุณแตะไฟล์และอัปเดตการประทับเวลาเมื่อปิดเครื่อง ที่จะช่วยให้คุณเห็นความแตกต่างระหว่างการรีสตาร์ทแบบเงียบและแบบเด็ดเดี่ยว
jdf

ขอบคุณนั่นเป็นจุดที่ดีเช่นกัน ฉันจะไม่สามารถตรวจสอบ / ทบทวนสถานการณ์ได้ง่าย ๆ ; โพสต์ต้นฉบับของฉันอายุเกือบครึ่งปีแล้วและเรามีการเปลี่ยนแปลงเล็กน้อยในระบบ ฉันจะตรวจสอบว่าฉันสามารถลองที่ไหนสักแห่งแม้ว่า - ถ้าฉันได้รับโอกาส
mindriot

3

ด้วยการกำหนดค่าเริ่มต้นบน Debian ผู้ใช้ที่ไม่มีสิทธิ์จะสามารถเข้าถึงทั้งบันทึกของ systemd-journald และ syslog หากเข้าสู่ระบบในฐานะผู้ใช้ปกติคุณจะได้รับการตอบกลับจาก journalctl:

$ journalctl 
No journal files were found.

ซึ่งค่อนข้างสับสน

หากคุณเข้าสู่ระบบในฐานะ root journalctl --unit=yourserviceควรให้ข้อมูลที่คุณต้องการ หลังจากsystemctl restart bind9บนเซิร์ฟเวอร์ของฉันฉันได้รับสิ่งนี้หลังจากjournalctl --unit=bind9:

Jun 03 18:20:24 ns systemd[1]: Stopping BIND Domain Name Server...
Jun 03 18:20:24 ns named[27605]: received control channel command 'stop'
Jun 03 18:20:24 ns systemd[1]: Starting BIND Domain Name Server...
Jun 03 18:20:24 ns systemd[1]: Started BIND Domain Name Server.

ถ้าฉันฆ่า bind9 อย่างชัดเจนด้วยkill -9, journalctl --unit=bind9ให้:

Jun 03 18:46:25 ns systemd[1]: bind9.service: main process exited, code=killed, status=9/KILL
Jun 03 18:46:25 ns rndc[28028]: rndc: connect failed: 127.0.0.1#953: connection refused
Jun 03 18:46:25 ns systemd[1]: bind9.service: control process exited, code=exited status=1
Jun 03 18:46:25 ns systemd[1]: Unit bind9.service entered failed state.
Jun 03 18:46:25 ns systemd[1]: bind9.service holdoff time over, scheduling restart.
Jun 03 18:46:25 ns systemd[1]: Stopping BIND Domain Name Server...
Jun 03 18:46:25 ns systemd[1]: Starting BIND Domain Name Server...
Jun 03 18:46:25 ns systemd[1]: Started BIND Domain Name Server.

บรรทัดแรกระบุว่ากระบวนการนั้นตายเพราะถูกฆ่า

systemd-journald ส่งต่อข้อความบันทึกทั้งหมดไปยัง syslog ดังนั้นคุณควรค้นหาข้อความเหล่านี้/var/log/syslogด้วย

Systemd และ systemd-journald ได้เริ่มต้นรวบรวมในการกำหนดค่าที่สามารถเปลี่ยนแปลงได้ในและ/etc/systemd/system.conf/etc/systemd/journald.conf

อาจเป็นประโยชน์ที่จะทราบว่าตามค่าเริ่มต้น systemd-journald จะเก็บบันทึกไว้ภายใต้ /runซึ่งก็คือtmpfsและจะหายไปหลังจากรีบูต ซึ่งหมายความว่าหากต้องการรับข้อความบันทึกที่เก่ากว่าการบูตครั้งล่าสุดคุณจะต้องดูไฟล์ syslog ในกรณีนี้ journalctl จะไม่ให้บันทึกเก่ากว่าการบูตครั้งล่าสุด นี้สามารถเปลี่ยนแปลงได้ในโดยการตั้งค่า/etc/systemd/journald.confStorage=persistent

หน้าคู่มือซึ่งเอกสารนี้คือ:

man 8 systemd-journald
man 5 journald.conf
man 5 systemd-system.conf
man 5 systemd-user.conf

โปรดทราบว่าเพื่อให้บริการที่จะเริ่มต้นใหม่โดยอัตโนมัติโดย systemd นี้จะต้องกำหนดค่าใน.serviceไฟล์มัน จากman 5 systemd.service:

   Restart=
       Configures whether the service shall be
       restarted when the service process exits, is
       killed, or a timeout is reached. The service
       process may be the main service process, but it
       may also be one of the processes specified with
       ExecStartPre=, ExecStartPost=, ExecStop=,
       ExecStopPost=, or ExecReload=. When the death
       of the process is a result of systemd operation
       (e.g. service stop or restart), the service
       will not be restarted. Timeouts include missing
       the watchdog "keep-alive ping" deadline and a
       service start, reload, and stop operation
       timeouts.

       Takes one of no, on-success, on-failure,
       on-abnormal, on-watchdog, on-abort, or always.
       If set to no (the default), the service will
       not be restarted.

ขอบคุณสำหรับการโพสต์ที่กว้างขวางและเป็นลายลักษณ์อักษรที่อาจแก้ไขปัญหาสำหรับผู้ใช้ส่วนใหญ่ น่าเสียดายที่ในกรณีของฉันฉันไม่เห็นบรรทัดบันทึกใด ๆ ที่เกิดขึ้นsystemdเมื่อส่งออกสมุดรายวันตามที่คุณอธิบายถึงแม้ว่าฉันจะทำงานเป็นหลักตลอดเวลา /var/log/syslogไม่แสดงอะไรเลย นี่คือ systemd 215 โดยวิธี
mindriot

3

คุณสามารถดูครั้งล่าสุดที่บริการของคุณเริ่มต้นหรือเริ่มใหม่ ใช้หรือservice chatty status systemctl status chattyนี่คือตัวอย่างสำหรับ apache2 หรือบริการ httpd:

# service apache2 status
● apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2)
  Drop-In: /lib/systemd/system/apache2.service.d
       └─forking.conf
   Active: active (running) since ven. 2017-06-02 15:53:01 CEST; 21min ago
  Process: 14773 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS)
  Process: 22912 ExecReload=/etc/init.d/apache2 reload (code=exited, status=0/SUCCESS)
  Process: 14880 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/apache2.service

Active: active (running) since Wen. 2017-06-02 15:53:01 CEST; 21min agoแสดงบรรทัดตั้งแต่บริการทำงาน แต่ฉันไม่รู้ว่าคุณสามารถแสดงเช่น 'รายการ' สิ่งที่คุณกำลังมองหา

# systemctl status httpd

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-10-11 00:35:58 EEST; 1 weeks 3 days ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 29728 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
 Main PID: 10722 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   Memory: 8.7M

1
serviceเป็นคำสั่ง Upstart เก่าที่ทำงานกับ systemd เพื่อความเข้ากันได้ พื้นเมืองคำสั่งsystemd systemctl status apache2
Mark Stosberg

ขอบคุณ แต่น่าเสียดายที่มันแสดงให้เห็นเฉพาะเมื่อบริการถูก (ใหม่) เริ่มต้น แต่ไม่ได้ว่าทำไม ; และยังแสดงเฉพาะสถานการณ์ปัจจุบันเช่นการรีสตาร์ทครั้งล่าสุด
mindriot

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.