Saya membuat layanan saya sendiri untuk jekyll dan ketika saya memulai layanan sepertinya tidak berjalan sebagai proses latar belakang karena saya terpaksa ctrl+ ckeluar dari itu. Itu hanya tetap di latar depan karena --watch. Saya tidak yakin bagaimana cara memutarnya dan membuatnya agar berjalan di latar belakang. Adakah pikiran?
# /etc/systemd/system/jekyll-blog.service
[Unit]
Description=Start blog jekyll
[Service]
Type=forking
WorkingDirectory=/home/blog
ExecStart=/usr/local/bin/jekyll build --watch --incremental -s /home/blog -d /var/www/html/blog &
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
User=root
Group=root
[Install]
WantedBy=multi-user.target
Type=forking
. Selain itu, itu tidak akan berjalanexecStart
sebagai ekspansi shell, sehingga&
pada akhirnya tidak akan pernah dipahami sebagai bendera latar belakang.Type=simple
akan lebih tepat. Juga, ini bukan jenis aplikasi yang akan saya jalankan sebagai root, setidaknya tidak pada mesin internet (yang mungkin bukan kasus Anda).--incremental
memang begitu :). Ya, saya tidak melihat masalah keamanan dalam meregenerasi file sebagai root. Tentu saja, mengingat bahwa file-file itu tidak disediakan pengguna.Jawaban:
Systemd mampu menangani berbagai jenis layanan yang berbeda khususnya salah satu dari yang berikut ini
simple
- Proses jangka panjang yang tidak melatarbelakangi dirinya sendiri dan tetap melekat pada shell.forking
- Sebuah dasmon khas yang bercabang sendiri melepaskannya dari proses yang menjalankannya, secara efektif melatar belakangi dirinya sendiri.oneshot
- Proses berumur pendek yang diharapkan untuk keluar.dbus
- Seperti sederhana, tetapi pemberitahuan proses penyelesaian startup dikirim melalui dbus.notify
- Seperti sederhana, tetapi pemberitahuan proses penyelesaian startup dikirim tidak sah.idle
- Seperti sederhana, tetapi biner dimulai setelah pekerjaan telah dikirim.Dalam kasus Anda, Anda telah memilih
Type=forking
yang berarti systemd sedang menunggu proses untuk memotong sendiri dan untuk proses induk berakhir, yang diperlukan sebagai indikasi bahwa proses telah mulai berhasil. Namun, proses Anda tidak melakukan ini - ia tetap berada di latar depan dansystemctl start
akan menggantung tanpa batas waktu atau hingga proses macet.Alih-alih, Anda menginginkannya
Type=simple
, yang merupakan default sehingga Anda dapat menghapus garis seluruhnya untuk mendapatkan efek yang sama. Dalam mode ini systemd tidak menunggu proses untuk menyelesaikan memulai (karena tidak memiliki cara untuk mengetahui kapan ini terjadi) dan dengan demikian terus menjalankan dan bergantung layanan langsung. Dalam kasus Anda tidak ada jadi ini tidak masalah.Catatan kecil tentang keamanan:
Anda menjalankan layanan sebagai root, ini tidak disarankan karena kurang aman daripada menjalankannya sebagai pengguna yang tidak memiliki hak. Alasan untuk ini adalah bahwa jika ada kerentanan dalam jekyll yang entah bagaimana memungkinkan eksekusi perintah (mungkin melalui kode itu parsing) maka penyerang perlu melakukan apa-apa lagi untuk sepenuhnya memiliki sistem Anda. Sebaliknya, jika dijalankan sebagai pengguna yang tidak memiliki hak istimewa, penyerang hanya dapat melakukan kerusakan sebanyak pengguna itu dan sekarang harus berusaha untuk mendapatkan hak akses root untuk sepenuhnya memiliki sistem Anda. Ini hanya menambahkan penyerang lapisan tambahan harus pergi sekalipun.
Anda cukup menjalankannya sebagai pengguna yang sama yang menjalankan server web Anda, tetapi ini membuat Anda terbuka untuk kemungkinan serangan lain. Jika ada kerentanan di server web Anda yang memungkinkan pengguna untuk memanipulasi file di sistem Anda, mereka dapat memodifikasi file html yang dihasilkan, atau terburuk file sumber dan menyebabkan server Anda melayani apa pun yang mereka inginkan. Namun, jika file yang dihasilkan dan file sumber hanya dapat dibaca oleh server web dan dapat ditulis menjadi pengguna yang tidak memiliki hak istimewa, mereka tidak akan dapat, dengan mudah, memodifikasinya dengan menyerang server web.
Namun, jika Anda hanya menyajikan file statis dari server ini dan menjaga server tetap up to date, serangan ini sangat kecil kemungkinannya - tetapi masih memungkinkan. Adalah tanggung jawab Anda untuk menimbang risiko vs overhead pengaturannya berdasarkan seberapa penting sistem Anda, tetapi kedua tips ini sangat sederhana untuk diatur dan hampir tidak ada overhead pemeliharaan.
sumber
Selain @ Michael Daffin solusi , Anda juga dapat menggunakan alat daemonize untuk mencapai penggunaan
forking
seperti yang ditunjukkan pada contoh berikut.Diberikan skrip shell kecil yang ingin saya daemonize dan yang ingin saya kontrol atas systemd, saya menyimpannya sebagai
/home/pi/testscript.sh
:Jika Anda belum memilikinya, instal daemonize, seperti ini:
Sekarang buat file definisi layanan file:
Layanan yang baru dibuat harus diumumkan ke systemd:
Sekarang Anda dapat memulai layanan dan garpu skrip. Seperti yang diharapkan, layanan mulai segera kembali ke shell. Hasilnya jelas:
sumber
daemonize
+Type=forking
alih-alihType=simple
dan membiarkan systemd mengurus memulai layanan?Type=forking
adalah semacam pengaturan kompatibilitas dalam systemd untuk mendukung program lawas yang ditulis untuk fork.