it-swarm-id.com

Jalankan skrip dengan rc.local: skrip berfungsi, tetapi tidak saat boot

Saya memiliki skrip node.js yang harus mulai saat boot dan dijalankan di bawah pengguna data-www. Selama pengembangan, saya selalu memulai skrip dengan:

su www-data -c 'node /var/www/php-jobs/manager.js

Saya melihat persis apa yang terjadi, manajer. Sekarang bekerja dengan baik. Mencari SO Saya menemukan saya harus meletakkan ini di /etc/rc.local saya. Juga, saya belajar mengarahkan output ke file log dan menambahkan 2>&1 ke "redirect stderr ke stdout" dan itu harus menjadi daemon sehingga karakter terakhir adalah &.

Akhirnya, /etc/rc.local saya terlihat seperti ini:

#!/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.

su www-data -c 'node /var/www/php-jobs/manager.js >> /var/log/php-jobs.log 2>&1 &'

exit 0

Jika saya menjalankan ini sendiri (Sudo /etc/rc.local): ya, itu berhasil! Namun, jika saya melakukan reboot, tidak ada proses node yang berjalan, /var/log/php-jobs.log tidak ada dan dengan demikian, manager.js tidak berfungsi. Apa yang terjadi?

36
Jurian Sluiman

Saya berakhir dengan pemula , yang berfungsi dengan baik.

5
Jurian Sluiman

Dalam contoh skrip rc.local ini saya menggunakan pengalihan io di baris pertama eksekusi ke file log saya sendiri:

#!/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.

exec 2> /tmp/rc.local.log  # send stderr from rc.local to a log file
exec 1>&2                      # send stdout to the same log file
set -x                         # tell sh to display commands before execution

/opt/stuff/somefancy.error.script.sh

exit 0
67
John Doe

Di beberapa linux (Centos & RH, mis.), /etc/rc.local pada awalnya hanyalah tautan simbolis ke /etc/rc.d/rc.local. Pada sistem tersebut, jika tautan simbolik terputus, dan /etc/rc.local adalah file yang terpisah, maka perubahan ke /etc/rc.local tidak akan terlihat saat bootup - proses boot akan menjalankan versi dalam /etc/rc.d. (Mereka akan bekerja jika seseorang menjalankan /etc/rc.local secara manual, tetapi tidak akan dijalankan saat bootup.)

Kedengarannya seperti pada sistem dimadima, mereka adalah file yang terpisah, tetapi /etc/rc.d/rc.local memanggil /etc/rc.local

Tautan simbolis dari /etc/rc.local ke yang 'asli' di /etc/rc.d dapat hilang jika seseorang memindahkan rc.local ke direktori cadangan dan menyalinnya kembali atau membuatnya dari awal, tidak menyadari yang asli di /etc hanyalah tautan simbolik.

10
user3533658

Di Ubuntu saya perhatikan ada 2 file. Yang asli adalah /etc/init.d/rc.local; sepertinya /etc/rc.local lainnya adalah palsu?

Setelah saya memodifikasi yang benar (/etc/init.d/rc.local) itu mengeksekusi seperti yang diharapkan.

4
Boyan

Anda mungkin juga membuatnya bekerja dengan menentukan path lengkap ke node. Selanjutnya, ketika Anda ingin menjalankan perintah Shell sebagai daemon, Anda harus menutup stdin dengan menambahkan 1 <& - sebelum &. 

3
w00t

Saya memiliki masalah yang sama (pada CentOS 7) dan saya memperbaikinya dengan memberikan izin eksekusi ke/etc/local:

chmod +x /etc/rc.local
2
Gayolomao

jika Anda menggunakan linux di cloud, maka biasanya Anda tidak memiliki kesempatan untuk menyentuh perangkat keras asli menggunakan tangan Anda. jadi Anda tidak melihat antarmuka konfigurasi saat boot untuk pertama kali, dan tentu saja tidak dapat mengkonfigurasinya. Akibatnya, layanan firstboot akan selalu berada di jalan menuju rc.local. Solusinya adalah menonaktifkan firstboot dengan melakukan:

Sudo chkconfig firstboot off

jika Anda tidak yakin mengapa rc.local Anda tidak berjalan, Anda selalu dapat memeriksa dari file /etc/rc.d/rc karena file ini akan selalu berjalan dan memanggil subsistem lain (mis. rc.local).

2
superyuan

Saya menggunakan CentOS 7. 

$ cd  /etc/profile.d

$ vim yourstuffs.sh

Ketik yang berikut ini ke skrip yourstuffs.sh.

ketik apa pun yang ingin Anda jalankan di sini

export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH

Simpan dan reboot OS.

1
lppier

Saya membuat skrip saya berfungsi dengan mengedit /etc/rc.local kemudian mengeluarkan 3 perintah berikut.

Sudo mv /filename /etc/init.d/
Sudo chmod +x /etc/init.d/filename 
Sudo update-rc.d filename defaults

Sekarang skrip bekerja saat boot.

1
CatGuyTX

Saya telah menggunakan rc.local di masa lalu. Tapi saya telah belajar dari pengalaman saya bahwa cara paling dapat diandalkan untuk menjalankan skrip Anda pada saat boot sistem adalah dengan menggunakan perintah @reboot di crontab. Sebagai contoh:

@reboot path_to_the_start_up_script.sh
0
Heapify

Ini adalah pemahaman saya bahwa jika Anda menempatkan skrip Anda di Level RUN tertentu, Anda harus menggunakan ln -s untuk menghubungkan skrip ke level yang Anda inginkan.

0
RVQ

Ini kemungkinan besar disebabkan oleh variabel lingkungan PATH yang hilang atau tidak lengkap.

Jika Anda memberikan path absolut penuh ke executable Anda (su dan node) itu akan berfungsi.

0
Asad R.

pertama-tama buat script dieksekusi menggunakanSudo chmod 755 /path/of/the/file.shsekarang tambahkan script di rc.local sh /path/of/the/file.sh.__ sebelum keluar 0in di rc.local, selanjutnya buat rc.local untuk dieksekusi denganSudo chmod 755 /etc/rc.localnext untuk menginisialisasi penggunaan rc.local Sudo /etc/init.d/rc.local start ini akan memulai rc.localsekarang me-reboot sistem . Selesai ..

0
Nikhil Parashar