Skip to content
VDS · المراقبة والأداء

سجلات systemd: journalctl بلغة مبسطة

كيف تجد سبب فشل خدمة في السجل، وتُصفّي ما تحتاجه حسب الوقت والمستوى، وتمنع السجلات من استهلاك القرص بالكامل.

آخر تحديث 23 أغسطس 2026

تقريبًا كل ما يحدث على النظام ينتهي في سجل systemd. خدمة لا تبدأ، الجهاز يعيد التشغيل من تلقاء نفسه، الموقع يعيد 502 — الإجابة عادةً مسجّلة بالفعل، كل ما تحتاجه هو معرفة كيف تسأل.

خمسة أوامر تكفي

journalctl -u nginx -n 50 --no-pager      # last 50 lines of one service
journalctl -u nginx -f                    # follow in real time
journalctl -p err -b                      # only errors since boot
journalctl --since "10 min ago"           # everything for the last ten minutes
journalctl -b -1 -e                       # previous boot log, end of file

الأمر الأخير قيّم بشكل خاص بعد إعادة تشغيل مفاجئة: -b -1 يفتح الجلسة السابقة، وفي النهاية يمكنك رؤية ما إذا كان السبب kernel panic، أو OOM killer أثناء عمله، أو إيقافًا نظيفًا.

المستويات في -p: emerg، alert، crit، err، warning، notice، info، debug. المستوى المحدد يشمل كل المستويات الأكثر أهمية.

تشخيص خدمة فاشلة

systemctl status myapp
journalctl -u myapp --since today -p warning

systemctl status يعطيك رمز الخروج والأسطر الأخيرة، وjournalctl يعطيك الصورة الكاملة. انظر إلى:

  • Main process exited, code=exited, status=1 — التطبيق خرج بخطأ من تلقاء نفسه، والسبب في السطر أعلاه؛
  • Failed to start ... Permission denied — الأذونات على ملف أو دليل، أو منفذ أقل من 1024؛
  • Killed process ... (java) total-vm... من النواة — OOM killer تدخّل، اقرأ نفاد الذاكرة؛
  • Start request repeated too quickly — الخدمة تدخل في حلقة انهيار، وقد أوقف systemd تشغيلها؛ أصلح السبب ثم نفّذ systemctl reset-failed myapp.

قائمة بكل ما هو معطّل على النظام هي systemctl --failed.

مرشحات توفر الوقت

journalctl --since "2026-08-22 03:00" --until "2026-08-22 04:00"
journalctl -u nginx -u php-fpm            # several services at once
journalctl _PID=1432                      # by specific process
journalctl -k                             # only kernel messages
journalctl -u sshd | grep "Failed password" | tail -20

اجمعها مع grep، لكن تذكّر: journalctl بدون --no-pager يفتح عارضًا، اخرج منه بـ q.

منع السجل من التهام القرص

افتراضيًا، ينمو السجل حتى 10% من القسم. على VDS-1 بقرص سعة 40 GB، هذا يعني أربعة غيغابايت — وهو مقدار ملحوظ.

journalctl --disk-usage
journalctl --vacuum-size=200M
journalctl --vacuum-time=14d

الحد الدائم موجود في /etc/systemd/journald.conf:

[Journal]
SystemMaxUse=300M
MaxRetentionSec=1month

ثم systemctl restart systemd-journald.

أخطاء شائعة

  • قراءة السجل بدون -u. التدفق العام مزدحم بسجلات الخدمات، ويضيع السطر الذي تحتاجه. دائمًا ضيّقه إلى خدمة أو مستوى.
  • فقدان السجل بعد إعادة التشغيل. إذا لم يكن الدليل /var/log/journal موجودًا، فإن السجل يعيش في الذاكرة فقط. أنشئه: mkdir -p /var/log/journal && systemd-tmpfiles --create --prefix /var/log/journal.
  • البحث عن أخطاء التطبيقات هناك. Nginx وPostgreSQL وما شابه يكتبان أيضًا في ملفاتهما الخاصة في /var/log. إذا كان السجل فارغًا، فتحقق هناك.

عندما يمتلئ القرص، قد يرفض journalctl العمل حتى يتم تحرير مساحة. هذه الحالة مشروحة في المقالة نفاد مساحة القرص.