Mengapa unit Systemd saya dimuat, tetapi tidak aktif (mati)?

29

Saya mencoba mengatur Graphite di server saya. Saya dapat memulai daemon Carbon Cache tanpa masalah sudo /opt/graphite/bin/carbon-cache.py start, tapi saya kesulitan menjalankannya sebagai unit Systemd.

Inilah yang saya miliki di file layanan saya graphite.service:

[Unit]
Description=Carbon for Graphite

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py start

[Install]
WantedBy=multi-user.target

Tetapi ketika saya memulai unit saya mendapatkan status berikut:

$ systemctl status graphite.service            
* graphite.service - Carbon for Graphite
   Loaded: loaded (/etc/systemd/system/graphite.service; enabled)
   Active: inactive (dead) since Fri 2014-06-13 18:44:11 UTC; 2s ago
  Process: 4525 ExecStart=/opt/graphite/bin/carbon-cache.py start (code=exited, status=0/SUCCESS)
 Main PID: 4525 (code=exited, status=0/SUCCESS)

Jun 13 18:44:11 MEADOW systemd[1]: Started Carbon for Graphite.

Journalctl tidak menghasilkan informasi lebih lanjut.

Bagaimana cara menafsirkan dan men-debug unit dengan status "tidak aktif (mati) ... (kode = keluar, status = 0 / SUKSES)"? Saya pernah melihat unit yang gagal sebelumnya, tetapi yang ini berhasil dimuat namun tidak berjalan dan saya tidak tahu apa artinya.

Ryne Everett
sumber
4
Itu berarti systemd telah menyelesaikan tugasnya. Bukankah seharusnya ada Type=pilihan? Lihat man systemd.servicejenis yang sesuai.
jasonwryan
1
Itu masuk akal. Semua harus saya lakukan adalah menambahkan Type=forkingke [Service]bagian.
Ryne Everett

Jawaban:

26

Per komentar jasonwryan, sementara standarnya Type=simpleberfungsi untuk banyak file layanan Systemd, itu tidak berfungsi ketika skrip dalam ExecStartmeluncurkan proses lain dan selesai, seperti halnya dengan carbon-cache.py graphite. Dalam kasus ini, Anda perlu menentukan secara eksplisit Type=forkingdi [Service]bagian sehingga Systemd tahu untuk melihat proses melahirkan daripada yang awal.

Sebagaimana dijelaskan dalam man systemd.service:

Jika diatur ke forking, diharapkan proses yang dikonfigurasikan dengan ExecStart = akan memanggil fork () sebagai bagian dari start-up-nya. Proses induk diharapkan untuk keluar ketika start-up selesai dan semua saluran komunikasi diatur. Anak itu terus berjalan sebagai proses daemon utama. Ini adalah perilaku daemon tradisional UNIX. Jika pengaturan ini digunakan, disarankan untuk juga menggunakan opsi PIDFile =, sehingga systemd dapat mengidentifikasi proses utama daemon. systemd akan melanjutkan dengan memulai unit tindak lanjut segera setelah proses induk keluar.

Jawaban Khusus Grafit

Sementara hal di atas menyelesaikan masalah Systemd saya, saya dengan cepat mengalami masalah khusus grafit (dengan Twisted) dan akhirnya kembali ke default Type.

Grafit <0.9.12

Dalam versi Graphite sebelumnya, seseorang hanya dapat menghindari forking dengan menggunakan --debugopsi:

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py --debug start

Grafit> = 0.9.13

Dalam permintaan tarik ini sebuah --no-daemonpilihan yang dilebur:

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py --no-daemon start
Ryne Everett
sumber