Özel bir uygulama için basit bir systemd servis dosyası oluşturdum. Elle çalıştırdığımda uygulama iyi çalışıyor, ancak systemd ile çalıştırdığımda CPU'm maksimuma çıkıyor.
Sorunumun nerede olduğunu bulmaya çalışıyorum, ancak çıktıyı nerede bulacağımı bilmiyorum (ya da sistemi nasıl bir yere koyacak şekilde yapılandırabilirim).
İşte servis dosyam:
[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
Başvuru boyunca stdout ve stderr çıktı.
Daemon'un çıktısını nasıl okuyabilirim?
Düzenle:
Bulduğum man systemd.exec
sözü hangi StandardOutput=
seçeneği, ancak bunu nasıl kullanılacağını emin değilim. Gönderen adam sayfası :
StandardOutput=
Yürütülen işlemlerin dosya tanımlayıcısı 1'in (STDOUT) nereye bağlı olduğunu kontrol eder. Birini alır inherit , boş , tty , syslog , kmsg , kmsg + konsolda , syslog + konsolun veya soket .
Olarak ayarlanırsa miras standart girdi dosya tanıtıcı standart çıkış için yineleniyor. Boş değere ayarlanırsa standart çıkış bağlanacaktır
/dev/null
, yani kendisine yazılan her şey kaybedilecektir. Tty'ye ayarlandıysa standart çıkış bir tty'ye bağlanacaktır (yapılandırıldığı gibiTTYPath=
aşağıya bakınız). Eğer TTY çıkış için kullanılırsa sadece yürütülen işlem terminalin kontrol süreci haline gelmeyecek ve diğer işlemlerin terminali serbest bırakmasını beklemeyecektir. syslog standart çıktıyı syslog (3) sistem günlüğüne bağlar. kmsg , onu dmesg (1) aracılığıyla erişilebilen çekirdek günlük arabelleğine bağlar. syslog + konsolu ve kmsg + konsolubenzer şekilde çalışır, ancak çıktısını sistem konsoluna da kopyalar. soket standart çıktıyı soket etkinleştirme işleminden bir sokete bağlar, anlambilim ilgili seçeneklere benzerStandardInput=
. Bu ayar varsayılan olarak devralınır.
Bu, benim tek seçenek olduğum anlamına mı geliyor? Örneğin, çıktının içine /dev/shm
falan koymak istiyorum . Sanırım bir Unix alan soketi kullanıp basit bir dinleyici yazabilirim, ama bu biraz gereksiz görünüyor.
Sadece hata ayıklama için buna ihtiyacım var ve muhtemelen günlüklerin çoğunu kaldırarak sonunu syslog olarak değiştireceğim.
/var/log/syslog
, ama /var/log/messages
hile yapar. Sorun şu ki günlüklere göre, arka planım başlangıçta çöküyor, ancak hala çalıştığını söyleyebilirim çünkü bir HTTP sunucusu var ve onu sorgulayabiliyorum. Görünüşe göre kayıtların geri kalanı kayboluyor ...
StandardOutput=tty
böylece daemon'unuzu başlatırken ne olduğunu görebilirsiniz. Terminalin çıkışını yapmalıdır ( ttyS0
ekranınızdaki çıkışı almak için kullanmanız gerekebilir veya benzer).
ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
/var/log/syslog
Çıktı için kontrol denediniz mi? Çoğu sistem bir şeyler girecek ve/var/log/
ben de orayı kontrol ederek başlayacağım.grep
Çıktıyı biliyorsanız metin aramak için kullanabilirsiniz :grep "my output" /var/log
hile yapmalısınız.