GNU/Linux >> Belajar Linux >  >> Linux

Pengganti Yang Benar Untuk Rc.local Di Systemd Daripada Membuat Ulang Rc.local?

Saya tidak dapat menemukan cara yang benar untuk menjalankan beberapa lokal skrip (atau perintah yang sangat lokal) di systemd, saya sudah tahu bahwa saya tidak boleh membuat layanan (dalam unit systemd) untuk skrip semacam ini (atau harus?)….

Solusi yang saya temukan adalah membuat rc.local dan memberikannya izin eksekusi.

printf '#!/bin/bash nnexit 0' >/etc/rc.local 
chmod +x /etc/rc.local

Misalnya, jika saya mendapatkan server lama dengan rc.local sederhana yang dikonfigurasi oleh Anda, saya akan tahu apa yang Anda lakukan dan betapa sakitnya untuk meningkatkan atau menginstal sesuatu yang baru di distro, karena rc.local dihormati oleh eksternal paket, tetapi di sisi lain jika saya menginstal server dan membuat satu atau dua atau tiga unit systemd (atau bahkan layanan sysvinit), hanya untuk melakukan tugas sederhana, ini terkadang dapat membuat hidup Anda lebih sulit, dan lebih dari ini unit saya nama suatu hari nanti dapat bertentangan dengan nama layanan baru yang dibuat oleh pengembangan distribusi, dan mungkin diinstal pada peningkatan, menyebabkan masalah untuk skrip saya !

Saya melihat pertanyaan lain menanyakan tentang di mana rc.local dan jawabannya adalah untuk membuatnya dan memberikan izin eksekusi, saya pikir pertanyaan saya benar-benar tidak sebuah duplikat , karena saya tidak ingin tahu di mana itu – percayalah, saya hanya ingin menerima bahwa itu tidak digunakan lagi , tetapi saya tidak dapat menemukan cara yang tepat untuk melakukan hal semacam ini, haruskah saya benar-benar membuat unit hanya untuk hal-hal sederhana seperti itu?

Jawaban yang Diterima:

Seperti yang ditunjukkan di tempat lain, penggunaan rc-local.service menjadi agak tidak bersih di bawah systemd .

  1. Secara teoritis mungkin distribusi Anda tidak akan mengaktifkannya. (Saya pikir ini tidak umum, misalnya karena menonaktifkan opsi build yang sama juga menghapus poweroff / reboot perintah yang digunakan banyak orang).
  2. Semantiknya tidak sepenuhnya jelas. Systemd mendefinisikan rc-local.service satu arah, tetapi Debian menyediakan file drop-in yang mengubah setidaknya satu pengaturan penting.

rc-local.service sering dapat bekerja dengan baik. Jika Anda khawatir tentang hal di atas, yang perlu Anda lakukan hanyalah membuat salinannya sendiri! Inilah keajaibannya:

# /etc/systemd/system/my-startup.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/my-startup-script

[Install]
WantedBy=multi-user.target

Saya rasa Anda tidak perlu memahami setiap detail[*], tetapi ada dua hal yang perlu Anda ketahui di sini.

  1. Anda harus mengaktifkan ini dengan systemctl enable my-startup.service .

  2. Jika skrip Anda memiliki ketergantungan pada layanan lain, termasuk network-online.target , Anda harus menyatakannya. Misalnya. tambahkan [Unit] bagian, dengan baris Wants=network-online.target dan After=network-online.target .

    Anda tidak perlu khawatir tentang ketergantungan pada layanan "boot awal" – khususnya, layanan yang sudah dipesan sebelum basic.target . Layanan seperti my-startup.service secara otomatis dipesan setelah basic.target , kecuali mereka menyetel DefaultDependencies=no .

    Jika Anda tidak yakin apakah salah satu dependensi Anda adalah layanan "boot awal", salah satu pendekatannya adalah dengan membuat daftar layanan yang dipesan sebelum basic.target , dengan menjalankan systemctl list-dependencies --after basic.target . (Perhatikan bahwa --after , bukan --before ).

Terkait:Dapatkan skrip untuk dijalankan lagi jika inputnya ya?

Ada beberapa pertimbangan yang menurut saya juga diterapkan pada rc.local pra-systemd :

  1. Anda perlu memastikan perintah Anda tidak bertentangan dengan program lain yang mencoba mengontrol hal yang sama.
  2. Sebaiknya jangan memulai program yang berjalan lama alias daemon dari rc.local .

[*] Saya menggunakan Type=oneshot + RemainAfterExit=yes karena lebih masuk akal untuk sebagian besar skrip one-shot. Ini memformalkan bahwa Anda akan menjalankan serangkaian perintah, yang my-startup akan ditampilkan sebagai "aktif" setelah selesai, dan Anda tidak akan memulai daemon.


Linux
  1. Cara mengatur nilai ulimit untuk layanan systemd

  2. Meluncurkan firefox di server jarak jauh menyebabkan firefox lokal membuka halaman sebagai gantinya

  3. Cara membatasi memori untuk layanan yang dikelola oleh systemd

  1. 10 perintah systemd yang berguna:Referensi

  2. Bagaimana Cara Menulis Script Startup Untuk Systemd?

  3. Bagaimana Cara Mengubah Pengguna Untuk Banyak File Layanan Systemd?

  1. Linux – Bagaimana Cara Mengatur Afinitas Cpu Default Untuk Semua Daemon Di Systemd?

  2. Apa cara yang benar untuk memulai layanan mongod di linux / OS X?

  3. Bagaimana menghentikan layanan systemd