Mengapa perintah di /etc/rc.local tidak dieksekusi saat startup?

39

Saya memiliki satu perintah dalam /etc/rc.localskrip saya yang seharusnya memulai pembaruan daemon untuk Tiny Tiny RSS selama startup, tetapi skrip tidak dieksekusi saat startup. Mengapa?

Seluruh file /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.

/sbin/start-stop-daemon -b -c www-data:www-data -S -x /usr/bin/php /var/www/ttrss/update_daemon2.php -- -quiet

exit 0

/etc/rc.local dapat dieksekusi:

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 342 May 25 16:14 /etc/rc.local

/etc/init.d/rc.local ada dan dapat dieksekusi:

# ls -l /etc/init.d/rc.local
-rwxr-xr-x 1 root root 801 Jul 27  2012 /etc/init.d/rc.local

/etc/init.d/rc.local seharusnya dijalankan saat startup untuk runlevel ini:

# runlevel 
N 2
# ls -l /etc/rc2.d/S99rc.local 
lrwxrwxrwx 1 root root 18 Sep 22  2012 /etc/rc2.d/S99rc.local -> ../init.d/rc.local

Jika saya secara manual memanggil /etc/rc.local dari baris perintah, update_daemon dimuat ...

# /etc/rc.local
# ps ax | grep update_daemon2.php
2233 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet
2234 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet

... yang harus saya ingat untuk lakukan setiap kali server saya restart sampai masalah ini diperbaiki.

Pertanyaan serupa sudah ada, tetapi sejauh ini saya belum dapat menerapkan informasi tersebut ke dalam masalah spesifik saya.

Mengapa perintah di rc.local tidak dieksekusi saat startup?

xx
sumber
Mungkin karena requirettypengaturan. Saat Anda masuk, Anda menjalankan skrip di TTY tetapi selama boot sistem, skrip itu tidak ada di TTY. Tautan ini dapat membantu Anda shell-tips.com/2014/09/08/... Terima kasih.
KICT

Jawaban:

23

rc.localskrip keluar jika ada kesalahan terjadi saat menjalankan salah satu perintahnya (sebutkan -eflag in #!/bin/sh -e).

Ada kemungkinan bahwa beberapa prasyarat tidak terpenuhi ketika Anda mencoba menjalankan perintah ketika rc.localeksekusi berlangsung, sehingga eksekusi perintah Anda gagal.

Saya mengalami hal yang sama saat mengatur gubernur cpu secara manual dan gagal melakukannya rc.local. Inilah solusi khusus saya, yang digunakan update-rc.duntuk membuat perintah Anda berjalan saat startup:

  1. Buat file myscript.shdalam direktori /etc/init.ddengan tajuk:#!/bin/sh
  2. Masukkan perintah khusus Anda sebagai konten
  3. Jadikan itu dapat dieksekusi: sudo chmod +x /etc/init.d/myscript.sh
  4. Buat symlink untuk skrip Anda untuk berbagai runlevel: sudo update-rc.d myscript.sh defaults

Anda juga dapat memeriksa /etc/network/if-up.dskrip dan melihat apakah Anda dapat memicu perintah Anda saat jaringan dimulai.

Drew
sumber
Terima kasih atas jawabannya. Pengaturan saya telah berubah sejak saya memposting pertanyaan, jadi saya tidak dapat menguji apakah jawaban Anda akan menyelesaikan masalah.
xx
Tolong beri tahu saya apa yang dilakukan langkah-4? Saya baru update-rc.d
mengenal
7

Saya punya beberapa masalah serupa di rc.local tidak dieksekusi pada saat startup

sshades memberi saya jawaban berikut:

Ubuntu sekarang menggunakan systemd, dan rc.local sekarang dianggap sebagai layanan yang dimatikan "secara default". Anda dapat mengaktifkan rc.local "on" dengan memasukkan perintah berikut dan me-reboot:

sudo systemctl enable rc-local.service

https://askubuntu.com/a/770033/395498

walaupun saya belum menguji solusinya saya pikir itu terdengar logis dan akan berhasil. Namun:

Saya juga menemukan solusi yang menambahkan skrip ke ./.config/autostart-scripts/ akan melakukan trik

Diet Bos
sumber
7
Mendapat kesalahan ini. File unit tidak memiliki konfigurasi instalasi (WantedBy, RequiredBy, Juga, pengaturan Alias ​​di bagian [Instal], dan DefaultInstance untuk unit template). Ini berarti mereka tidak dimaksudkan untuk diaktifkan menggunakan systemctl. Alasan yang mungkin untuk memiliki jenis unit ini adalah: 1) Unit dapat diaktifkan secara statis dengan disinkronkan dari direktori .wants / atau .requires / direktori unit lain. 2) Tujuan suatu unit mungkin untuk bertindak sebagai penolong bagi beberapa unit lain yang memiliki ketergantungan terhadapnya.
Rıfat Erdem Sahin
Saya juga mendapatkan kesalahan ini. Jika rc.localdimatikan, apa alternatifnya?
Ben
5

coba sudo sysv-rc-confdan periksa apakah rc.localdiaktifkan

rc.local         [ ]   [x]   [x]   [x]   [x]   [ ]   [ ]   [ ]
zuba
sumber
Ya, itu diaktifkan.
xx
apakah perintah ini perlu diinstal?
jcollum
1
@ jcollum ya, ini adalah program dari paket yang bernama sama. Untuk menginstal, ketiksudo apt install sysv-rc-conf
banan3'14
rc.localbahkan tidak ada dalam daftar layanan saya!
Ben
5

Pastikan skrip rc.local dapat dieksekusi:

sudo chmod +x /etc/rc.local

Kemudian, aktifkan:

sudo systemctl enable rc-local.service

Nyalakan ulang sistem atau mulai skrip secara manual dengan menjalankan:

sudo systemctl start  rc-local.service

Status layanan dapat ditampilkan dengan menjalankan:

$ sudo systemctl status rc-local.service
 rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled) 
Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: active (running) since Mon 2018-04-02 10:39:44 -03; 1s ago
  Process: 2044 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
 Main PID: 2049 (svscanboot)
Tasks: 3
 Memory: 556.0K
CPU: 10ms
CGroup: /system.slice/rc-local.service
leobocao
sumber
Anda tidak perlu mengaktifkan layanan secara manual. Jika file ada dan dapat dieksekusi, systemd akan secara otomatis mengaktifkan rc-locallayanan.
muru
4

Kami memiliki masalah ini pada beberapa server yang di-host memuat aturan FW.

Pada kotak-kotak ini mereka reboot SANGAT cepat dan kami menemukan hanya meletakkan "sleep 1" di rc.local sebelum pernyataan beban tampaknya untuk memperbaiki masalah. Saya kira itu memberi sedikit waktu untuk antarmuka untuk menyelesaikan sebelum memuat aturan FW.

Simon Hart
sumber
1
Terima kasih. sleep 1memecahkan masalah saya. Menarik Saya punya banyak server tetapi hanya satu yang memiliki masalah ini.
Qian Chen
1

Saya pernah mengedit rc.localdengan Notepad di Windows dan mulai memiliki masalah ini.

Dalam hal ini, menggunakan editor teks yang mendukung Konversi EOL, seperti Notepad ++, untuk mengubah gaya EOL ke 'Unix', dapat menyelesaikannya.

Anda juga dapat melakukannya :set ff=unixdi Vim.

SyaSyaNown
sumber
1

Saya menemukan dalam wadah Ubuntu lxc bahwa jika rc.local memiliki contoh shebang yang benar benar

#!/bin/sh

gagal, tetapi jika Anda menghapus shebang itu berfungsi.

Tidak sampai ke dasar mengapa atau apa shell yang digunakannya saya pikir itu bom pada non-nol pertama juga. (Di Ubuntu lain menginstal shebang yang tepat tidak menjadi masalah)

teknopaul
sumber
0

Anda harus memastikan bahwa /etc/rc.localdieksekusi selama startup server dengan perintah:

sudo systemctl enable rc-local.service

William
sumber