Bagaimana saya bisa menjalankan perintah pada startup (alternatif rc.local) di Ubuntu 16.10

49

Saya mengatur kuota di server Linode saya yang menjalankan Ubuntu 16.10, dan saya mendapatkan kesalahan berikut

Tidak dapat stat () memasang perangkat / dev / root: Tidak ada file atau direktori tersebut

Jadi untuk memperbaikinya, saya mencapai utas ini untuk perbaikan yang dilakukan dengan menambahkan

ln -s /dev/xvda /dev/root
/etc/init.d/quota restart

ke /etc/rc.local. Tetapi Ubuntu 16.10 tidak digunakan rc.locallagi melainkan menggunakan systemd . Apa alternatifnya rc.local, Bagaimana saya bisa menjalankan perintah di atas saat startup?

Saya juga mengaktifkan layanan menggunakan systemctl enable rc-local.servicetetapi tidak berhasil untuk saya. Setiap petunjuk akan dihargai.

Saurabh Sharma
sumber
Anda menjalankannya sebagai root, dan apakah Anda me-restart sistem Anda?
George Udosen
@ George ya, saya melakukan keduanya
Saurabh Sharma
coba ini
George Udosen
@ George Itu tidak bekerja juga
Saurabh Sharma
Baru saja melihat
retasan

Jawaban:

65

Intro

Saya pikir Anda tidak harus membuat layanan baru seperti yang disarankan dalam tautan oleh George. The rc-local.servicesudah ada di systemd dan file layanan menunjukkan bahwa rc.local, jika ada dan dieksekusi, akan ditarik secara otomatis kemulti-user.target . Jadi tidak perlu membuat ulang atau memaksakan sesuatu yang baru saja dilakukan dengan cara lain oleh systemd-rc-local-generator.

Satu solusi

Solusi cepat (Saya tidak tahu apakah itu cara kanonik):

Di terminal lakukan:

printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
sudo reboot

Setelah itu rc.localakan dipanggil sistem startup. Masukkan apa yang Anda inginkan.

Latar Belakang

Jika Anda melakukannya di terminal:

sudo systemctl edit --full rc-local

Anda dapat melihat bahwa komentar kepala berisi baris seperti:

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.

Ini menunjukkan, bahwa dalam sistem ini, jika ada file bernama /etc/rc.localyang dapat dieksekusi, maka akan ditarik ke multi-user.target secara otomatis. Jadi, Anda cukup membuat file yang sesuai ( sudo touch...) dan menjadikannya executable ( sudo chmod +x ...).

Jan
sumber
4
Jangan gunakan #!/bin/bash, gunakan #!/bin/shkecuali Anda benar-benar membutuhkan bash dalam skrip Anda. Semua skrip sistem lainnya menggunakan tanda hubung, bukan bash, untuk alasan kinerja.
spikyjt
"tidak perlu membuat ulang atau memaksa sesuatu yang hanya dilakukan dengan cara lain oleh systemd-rc-local-generator" rc-localtidak memungkinkan untuk memesannya setelah beberapa unit lain, bukan?
x-yuri
20

Saya melihat solusi ini disarankan yang melibatkan penggunaan di systemd sini :

  1. Buat layanan:

    sudo vi /etc/systemd/system/rc-local.service
    
  2. Tambahkan kode Anda di sana:

    [Unit]
    Description=/etc/rc.local Compatibility
    ConditionPathExists=/etc/rc.local
    
    [Service]
    Type=forking
    ExecStart=/etc/rc.local start
    TimeoutSec=0
    StandardOutput=tty
    RemainAfterExit=yes
    SysVStartPriority=99
    
    [Install]
    WantedBy=multi-user.target
    
  3. Buat dan pastikan /etc/rc.localdapat dieksekusi dan tambahkan kode ini di dalamnya:

    sudo chmod +x /etc/rc.local

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    exit 0
    
  4. Aktifkan layanan:

    sudo systemctl enable rc-local
    
  5. Mulai layanan dan periksa status:

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
  6. Jika semuanya berjalan dengan baik, Anda dapat menambahkan Anda codeke /etc/rc.localfile kemudian restart.

Catatan: Diuji pada Lubuntu 16.10.

Sumber:

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd

George Udosen
sumber
Saya melakukan semua langkah. Saya memiliki rc.local dengan: touch "hello"sebelum exit 0. Layanan ini tampaknya aktif tetapi tidak membuat file di / etc / dir Berjalan di ubuntu 16.04 Arabian 5.31
Danny182
Seperti yang dijawab oleh @Jan, menciptakan layanan baru tidak diperlukan karena systemd sudah mendukung rc.local.
TommyPeanuts
Terima kasihuuuuuuuuuuuuuuuuuuuu, ini hanya berfungsi
GPrathap
2

Untuk menambah jawaban Jan bahwa, tidak seperti rc.localfile biasa , rc-local servicedijalankan bukan setelah semua layanan dimulai, tetapi setelah jaringan online.

Dalam beberapa kasus, Anda mungkin ingin menjalankan perintah dari rc.localnanti. Sebagai contoh, saya ingin dieksekusi setelah lxdmulai.

Dalam hal ini Anda dapat mengedit rc-local servicedependensi startup dengan membuat file conf drop-in: /etc/systemd/system/rc-local.service.d/override.conf dengan konten:

[Unit]
After=network.target lxd.service

Di mana Anda dapat menambahkan nama unit yang dibutuhkan (seperti yang saya tambahkan lxd.service)

Jangan lupa systemctl daemon-reloadsetelah itu.

pengguna2586441
sumber
Selamat Datang di Tanya Ubuntu! Jika Anda ingin meningkatkan jawaban lain, harap sarankan edit untuk itu. Jika Anda ingin menyajikan alternatif parsial, ulangi atau kutip bagian-bagian yang sama (kalau-kalau jawaban aslinya berubah) dan sorot perbedaannya. Bagaimanapun, jangan membuat jawaban baru yang tidak lengkap ! Terima kasih.
David Foerster