Ubuntu 16.10'da başlangıçta (rc.local alternative) komutunu nasıl çalıştırabilirim?


49

Ubuntu 16.10 çalıştıran Linode sunucumda kota oluşturuyorum ve aşağıdaki hatayı alıyorum

Stat () monte edilmiş cihaz / dev / root: Böyle bir dosya veya dizin yok

Böylece bunu düzeltmek için ekleyerek yapılan düzeltmeye bu konuya ulaştım.

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

için /etc/rc.local. Fakat Ubuntu 16.10 rc.localartık kullanmıyor, systemd kullanıyor . Alternatif nedir, rc.localyukarıdaki komutları başlangıçta nasıl çalıştırabilirim?

Ayrıca hizmeti kullanarak da etkinleştirdim, systemctl enable rc-local.serviceancak benim için işe yaramadı. Herhangi bir ipucu takdir edilecektir.


kök olarak çalıştırıp, sisteminizi yeniden başlattınız mı?
George Udosen

@ George evet, ikisini de yaptım
Saurabh Sharma


@George Bu da işe yaramıyor
Saurabh Sharma

Sadece bu kesmeyi gördüm, uçup
gitmediğine

Yanıtlar:


65

giriş

Bence George'un linkinde önerildiği gibi yeni bir servis yaratmamalısınız. rc-local.serviceZaten systemd var ve hizmet dosya düşündürmektedir rc.localVar olduğundan ve çalıştırılabilir ise, içine otomatik olarak çekip alırmulti-user.target . Bu yüzden, sadece başka bir şekilde yapılan bir şeyi yeniden yaratmaya veya zorlamaya gerek yok systemd-rc-local-generator.

Bir çözüm

Hızlı bir geçici çözüm (kanonik yol olup olmadığını bilmiyorum):

Bir terminalde:

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

Bundan sonra rc.localsistem başlatılırken çağrılacak. İstediğini ekle.

Arka fon

Bir terminalde yaparsanız:

sudo systemctl edit --full rc-local

Başlık yorumunun aşağıdaki gibi satırlar içerdiğini görebilirsiniz:

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

Bu, bu sistemde /etc/rc.localçalıştırılabilir bir dosya varsa, otomatik olarak multi-user.target dosyasına çekileceğini gösterir. Yani sadece uygun dosyayı yaratın ( sudo touch...) ve çalıştırılabilir ( sudo chmod +x ...) yapın.


4
Kullanmayın #!/bin/basholsa, kullanım #!/bin/shsürece gerçekten komut bash gerekir. Diğer tüm sistem komut dosyaları, performans nedenleriyle bash yerine çizgi kullanır.
spikyjt

"systemd-rc-local-generator tarafından başka bir şekilde yapılan bir şeyi yeniden yaratmaya veya zorlamaya gerek yok" rc-localbaşka bir üniteden sonra sipariş vermesine izin vermiyor, değil mi?
x-yuri,

20

systemd Burada kullanılmasını içeren önerilen bir çözüm gördüm :

  1. Hizmet oluştur:

    sudo vi /etc/systemd/system/rc-local.service
    
  2. Kodunuzu buraya ekleyin:

    [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. Oluşturun ve /etc/rc.localçalıştırılabilir olduğundan emin olun ve içine şu kodu ekleyin:

    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. Hizmeti etkinleştir:

    sudo systemctl enable rc-local
    
  5. Servisi başlat ve durumu kontrol et:

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
  6. Her şey yolunda giderse code, /etc/rc.localdosyayı da ekleyebilir, sonra yeniden başlatabilirsin.

Not: Lubuntu 16.10'da test edilmiştir.

Kaynak:

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


Tüm adımları ben yaptım. Ben ile rc.local var: touch "hello"önce exit 0. 16.04 Arap 5.31 hizmetin etkin olarak görünüyor ama ubuntu üzerinde Koşu / etc / dir herhangi bir dosyayı yaratmaz
Danny182

@Jan tarafından verilen cevapların işaret ettiği gibi, systemd zaten rc.local'ı desteklediği için yepyeni bir hizmet oluşturmak gerekli değildir.
TommyPeanuts

Teşekkür ederim senuuuuuuuuuuuuuuuuuuuu, bu sadece çalışıyor
GPrathap

2

Jan'ın cevabını eklemek için , normal rc.localdosyadan farklı olarak, rc-local servicetüm servisler başlatıldıktan sonra değil, ağ çevrimiçi olduktan sonra idam edilir.

Bazı durumlarda rc.localdaha sonradan komut çalıştırmak isteyebilirsiniz . Örneğin, lxdbaşlangıçtan sonra çalıştırılmasını istedim .

Bu durumda rc-local servicebaşlangıç ​​bağımlılıklarını bir açılan conf dosyası oluşturarak düzenleyebilirsiniz : /etc/systemd/system/rc-local.service.d/override.conf içeriği:

[Unit]
After=network.target lxd.service

Gerekli bir ünite adını ekleyebileceğiniz yeri (eklediğim gibi lxd.service)

Ondan systemctl daemon-reloadsonra yapmayı unutma .


Ubuntu'ya Sormaya Hoş Geldiniz! Başka bir cevabı geliştirmek istiyorsanız, lütfen bir düzenleme öneriniz. Kısmi bir alternatif sunmak istiyorsanız, lütfen aynı parçaları tekrarlayın veya alıntı yapın (orijinal cevabın değişmesi durumunda) ve farklılıkları vurgulayın. Her durumda yeni bir eksik cevap oluşturmayın ! Teşekkür ederim.
David Foerster
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.