6.09.2024

Linux'ta beklenmeyen kapanmalar - 2

Daha önce şu yazımda Linux'ta beklenmeyen kapanmaların nasıl tespit edileceğini yazmıştım. O yazımda da bahsettiğim ve bu yazının altında yer alan adreslerde de kullanımından bahsedilen systemd birim dosyası ile beklenmeyen kapanmaların tespit edilmesi yöntemine journal loglarını da dahil ettim, bu konuyu da paylaşmak istedim.

Hedefimiz şu:

1. İşletim sistemi düzgün kapatılırken /root/graceful_shutdown dosyasını yazsın. İçi boş bir dosya. Sadece varlığı, kapanmanın düzgün olduğunu gösterecek. Kapatılırken de journal'a "graceful shutdown" yazsın.

2. Açılışta ilk adımda oluşturulan /root/graceful_shutdown dosyasının varlığı kontrol edilsin. Dosya varsa silinsin (çünkü kapatılırken tekrar oluşturulacak) ve journal'a "startup found graceful shutdown" yazsın.

3. Açılışta /root/graceful_shutdown dosyası yoksa journal'a "startup did not find graceful shotdown" gibi bir mesaz yazsın.

Bu hedef doğrultusunda 3 systemd birim dosyası oluşturacağız. Konumumuz /etc/systemd/system klasörü. İlk dosyamız birinci hedefimiz ile ilgili. Aşağıdaki dosyayı /etc/systemd/system/set_gracefulshutdown.service olarak kaydedelim.

[Unit]
Description=Set flag for graceful shutdown
DefaultDependencies=no
RefuseManualStart=true
Before=shutdown.target

[Service]
Type=oneshot 
ExecStartPre=logger "graceful shutdown"
ExecStart=/bin/touch /root/graceful_shutdown

[Install]
WantedBy=shutdown.target

İkinci hedefimiz için aşağıdaki dosyayı /etc/systemd/system/check_graceful.service olarak kaydedelim.

[Unit]
Description=Check if previous system shutdown was graceful
ConditionPathExists=/root/graceful_shutdown
RefuseManualStart=true
RefuseManualStop=true

[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=logger "startup found graceful shutdown"
ExecStart=/bin/rm /root/graceful_shutdown

[Install]
WantedBy=multi-user.target

Üçüncü hedefimiz için de aşağıdaki dosyayı /etc/systemd/system/check_notgraceful.service konumuna kaydedelim. Bunun yegane amacı sistem loglarına bir düzgün kapanma olmadığını yazabilmek.

[Unit]
Description=Detect unexpected shutdown
ConditionPathExists=!/root/graceful_shutdown
RefuseManualStart=true
RefuseManualStop=true

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=logger "startup did not find graceful shutdown"

[Install]
WantedBy=multi-user.target

Sonra bunları etkinleştirmek için şu adımları uygulayalım:

# sudo systemctl daemon-reload
# sudo systemctl enable set_gracefulshutdown
# sudo systemctl enable check_graceful
# sudo systemctl enable check_notgraceful

İşletim sistemi açıldıktan sonra da bir önceki kapanışın beklenmeyen bir kapanış mı olduğunu anlamak için check_graceful hizmetinin başlayıp başlamadığını kontrol edebiliriz:

# systemctl is-active check_graceful

ya da journalctl ile son 3 günlük loglarda graceful geçip geçmediğine bakabiliriz:

# journalctl --since "3 days ago" -g graceful

Galiba oldu. logger yerine systemd-cat kullanılabilir. Bu komutun -p ile mesajın öncelik seviyesi de belirtilebilir:

# echo "No graceful_shutdown file found" | systemd-cat -p info

gibi.

Bu dosyaları oluşturuken yaşanabilecek muhtemel yazım hatalarını tespit edebilmek için systemd-analyze'ın verify komutunu da kullanabiliri.

# systemd-analyze verify /etc/systemd/system/check_notgraceful.service

 [12/2023]

---

[1] https://access.redhat.com/articles/2642741

[2] https://www.suse.com/support/kb/doc/?id=000020272

Hiç yorum yok: