Lompat ke konten utama

Generator Unit systemd

Layanan yang menyala sendiri dan pulih setelah gagal

Susun file unit .service dan .timer lengkap dengan kebijakan jalan-ulang, batas pengaman, pengalihan log ke journal, dan pembatas keamanan yang setiap barisnya dijelaskan.

Tanpa akhiran .service.
Wajib jalur penuh — systemd tidak membaca PATH shell Anda.
Jangan root kecuali benar-benar perlu.

detik
Pengganti cron yang tercatat rapi di journal.
Membatasi apa yang boleh disentuh layanan ini bila kelak ia dibobol. Penjelasan tiap barisnya disertakan di hasil.

Simpan ke /etc/systemd/system/, lalu jalankan systemctl daemon-reload. Langkah lengkapnya ada di bagian bawah hasil.

Seluruh perhitungan berjalan di browser Anda. Alamat IP, nama interface, dan password yang Anda masukkan tidak pernah dikirim ke server CoreNet.

Kapan sebuah program layak dijadikan layanan

Ketika ia harus hidup terus, menyala sendiri setelah mesin dinyalakan ulang, dan pulih sendiri bila mati. nohup ... & memenuhi yang pertama saja, dan hilang begitu session SSH ditutup.

Batas pengaman yang sering dilupakan

Restart=always tanpa batas adalah cara membanjiri log dalam hitungan menit: program yang gagal seketika akan dijalankan ulang tanpa henti. Unit yang dihasilkan di sini menyertakan:

StartLimitBurst=5
StartLimitIntervalSec=60

Setelah lima kegagalan dalam satu menit, systemd berhenti mencoba dan meninggalkan jejak yang dapat dibaca — jauh lebih berguna daripada log sepuluh gigabita.

Pembatas keamanan, dan efek sampingnya

Baris seperti ProtectSystem=full dan PrivateTmp=yes membatasi apa yang dapat disentuh layanan seandainya ia dibobol. Nilainya nyata, tetapi ada harganya yang perlu diketahui sejak awal:

Bila layanan tiba-tiba gagal dengan "Permission denied" pada folder yang jelas-jelas berhak ditulis, salah satu baris pembatas inilah penyebabnya — bukan hak akses filenya. ProtectSystem=full membuat hampir seluruh sistem file menjadi hanya-baca dari sudut pandang layanan itu.

Jalan keluarnya bukan mematikan pembatasnya, melainkan menyebutkan folder yang memang perlu ditulis:

ReadWritePaths=/var/www/app/writable

systemd timer sebagai pengganti cron

Untuk tugas berkala, timer punya dua keunggulan yang sering menentukan:

Persistent=true menjalankan tugas yang terlewat karena mesin sedang mati. Cron melewatkannya begitu saja — dan pada server yang dimatikan tiap malam, itu berarti backup harian yang tidak pernah berjalan.

RandomizedDelaySec menyebar waktu mulai secara acak. Ketika lima puluh mesin menjalankan update pada jadwal yang sama, penyebaran itu yang mencegah server tujuan tumbang.

Satu hal yang sering keliru: pada pola timer, yang di-enable adalah timer-nya, bukan service-nya. Meng-enable service akan membuatnya berjalan sekali saat boot lalu tidak pernah lagi.

After=network-online.target, bukan network.target

network.target hanya berarti "penyiapan jaringan sudah dimulai". Layanan yang butuh alamat IP sering menyala terlalu cepat karenanya, gagal menyambung, lalu masuk daur jalan-ulang. network-online.target menunggu sampai jaringan benar-benar siap.

Sesudah mengubah file unit

systemctl daemon-reload wajib diulang. Tanpa itu, systemd tetap memakai isi yang lama dan perubahan Anda seolah tidak berpengaruh sama sekali.

Pertanyaan yang sering diajukan

Kenapa layanan saya "active (exited)"? Karena Type=simple dipakai untuk program yang langsung selesai. Untuk tugas sekali jalan, pakai Type=oneshot dengan RemainAfterExit=yes.

Di mana lognya? journalctl -u nama-layanan -f. Tidak ada file log tersendiri kecuali Anda membuatnya.

Bolehkah User=root? Bisa, dan sebaiknya tidak. Layanan yang berjalan sebagai root memberi kuasa penuh kepada siapa pun yang berhasil membobolnya.

Lanjut ke