Cara menjalankan skrip saat boot sebagai root

59

Saya memiliki skrip yang secara otomatis mengaktifkan wifi saya tanpa menggunakan networkmanager, tetapi saya tidak tahu cara menjalankan skrip sebagai root ketika sistem sedang booting. Bagaimana cara membuat skrip berjalan secara otomatis saat boot?

pengguna128712
sumber
Program mulai otomatis dikonfigurasikan dalam autostartmanifes atau dalam *.servicefile di beberapa lokasi, serta di init.datau crontab. Lihat ini: unix.stackexchange.com/a/525845/43233
Noam Manos

Jawaban:

54

Tempatkan skrip yang ingin Anda jalankan di direktori /etc/init.d dan buat skrip tersebut dapat dieksekusi.

chmod 755 myscript

Setelah selesai, buat tautan simbolis di direktori run level yang ingin Anda gunakan, misalnya jika Anda ingin menjalankan program di grafis runlevel 2, runlevel default untuk Ubuntu, Anda akan meletakkannya di /etc/rc2.ddirektori. Anda tidak bisa menempatkannya di direktori, Anda harus menandakan kapan itu akan berjalan dengan menunjukkan startup dengan "S" dan urutan eksekusi penting. Tempatkan setelah semua yang ada di direktori dengan memberikannya angka yang lebih tinggi.

Jika skrip terakhir yang dijalankan adalah rc.localdan diberi nama S99rc.localmaka Anda perlu menambahkan skrip Anda sebagai S99myscript.

ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript

Setiap /etc/rc*.ddirektori yang kompatibel mundur memiliki tautan simbolis ke /etc/init.d/direktori.

Radu Rădeanu
sumber
1
Perhatikan bahwa di bawah Ubuntu Server 14.04, saya perlu menggunakan /etc/rc2.d, bukan rc3.dseperti yang ditunjukkan dalam contoh. Tampaknya rc2.dbukan hanya level run grafis.
Brad
1
cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.dakan membawa Anda ke /etc/rc?.ddirektori mana yang sesuai dengan runlevel default Anda.
Kevin
1
Sebaliknya: "Jika skrip terakhir yang dijalankan adalah rc.localdan diberi nama S99rc.localmaka Anda perlu menambahkan skrip Anda sebagai S99myscript.". Apakah maksud Anda: "Jika skrip terakhir yang dijalankan adalah myscriptdan diberi nama S99myscriptmaka Anda perlu menambahkan skrip Anda sebagai S99myscript." ???
Dor
6
Perlu diingat bahwa ini tidak akan berfungsi dengan systemd (yaitu, dimulai dengan Ubuntu 16.04). Lihat ini sebagai gantinya.
Alexander Revo
26

Sertakan perintah dalam /etc/rc.local. Ini akan dijalankan setiap kali runlevel pengguna berubah.

Catatan: Anda harus meletakkan perintah sebelum baris terakhir di /etc/rc.local yang berisi: "exit 0".

thethourtheye
sumber
3
Catatan: Anda harus meletakkan perintah sebelum baris terakhir /etc/rc.localyang berisi: exit 0
rubo77
3
/etc/rc.localdi ubuntu 15.10 berkomentar bahwa "Script ini dijalankan di akhir setiap runlevel multiuser." Jadi skrip bisa dijalankan beberapa kali saat boot, kan?
jarno
@ jamo, ya, di setiap runlevel. Saya tidak tahu bagaimana ini terkait dengan menjalankan "saat boot", yang biasanya berarti "jalankan sekali saat boot".
erm3nda
17

Gunakan crontabopsi untuk membuat skrip Anda berjalan setelah reboot,

Anda dapat melakukannya dengan menambahkan @rebootkode di cron

Buka crontab oleh pengguna root:

$ sudo crontab -e

Tambahkan catatan berikutnya di bagian bawah:

@reboot yourScriptPath 

Itu akan melakukan apa yang Anda inginkan.

hs.chandra
sumber
Apakah maksud Anda menggunakan perintah crontab -e, yang tidak memerlukan hak pengguna super? Saya bertanya-tanya, apakah bisa menjalankan skrip yang perlu dijalankan sebagai root.
jarno
Saya menguji ini. Itu tidak menjalankan skrip sebagai root.
jarno
4
Anda harus menambahkan baris sambil menjalankan perintah sudo crontab -euntuk membuatnya menjalankan skrip sebagai root selama startup.
jarno
jangan lupa untuk menghapus /var/run/crond.reboot, jika tidak, tidak akan menjalankan tugas
Albert Català
Hanya untuk catatan, saya yakin bahwa @jarno akan mengetahuinya. Setiap pengguna memiliki tugas cron sendiri, jadi jika Anda menambahkannya ke tugas pengguna Anda (menjalankan crontab -e tanpa sudo) skrip akan dijalankan oleh pengguna Anda. Jadi, Anda perlu menjalankannya sebagai root agar dapat menjalankan skrip sebagai root saat boot.
eddieferetro
9

Ini bekerja untuk saya di Ubuntu 17.04:

  1. buat file skrip tur seperti disable_cdromdi lokasi Anda. Dalam kasus saya home/yterle/disable_cdrom. Dalam hal ini:

    #!/bin/sh
    eject /dev/sr0 -i 1
  2. membuatnya bisa dieksekusi chmod 775 disable_cdrom

  3. navigasikan ke /etc/systemd/systemdan buat di sana servicefile. Sebagai contohsudo gedit /etc/systemd/system/disable_cdrom.service

disable_cdrom.servicePenampilan saya seperti ini:

[Unit]
Description=Disable cdrom

[Service]
Type=oneshot
ExecStart=/bin/sh /home/yterle/disable_cdrom

[Install]
WantedBy=multi-user.target

Di mana ExecStartpoin untuk menjalankan skrip Anda/bin/sh

Kemudian jalankan systemctl enable disable_cdrom.serviceuntuk mengaktifkan layanan systemd

YTerle
sumber
1
Memilih ini karena itu yang saya cari, tapi saya pikir maksud Andasystemctl enable disable_cdrom.service
KennetRunner
5

Sertakan file Script Anda /etc/init.d/ dengan izin Executable kemudian tetapkan level run yang berbeda

$ update-rc.d script-name default

Ini akan menempatkan skrip Anda pada boot startup.

MS Parmar
sumber
Tidak bekerja untuk saya di Kali Linux v2.0. Apakah maksud Anda update-rc.d script-name enable?
Sopalajo de Arrierez
update-rc.d <script-name> skrip shell default yang telah Anda salin di /etc/init.d/ <script-name>
MS Parmar
4

Buat file teks seperti ini di /etc/cron.d/:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

@reboot   root    yourScriptPath

(Anda harus mengganti yourScriptPathdengan path ke skrip yang ingin Anda jalankan.)

jarno
sumber
1

Hati-hati dengan menambahkan skrip ke rc.local- Saya terjebak di layar splash karena itu. Menekan Alt+ F1mengungkapkan apa yang terjadi di balik layar splash (skrip in rc.localsedang berjalan).

Saya tidak bisa keluar dari situ.

  • Ctrl+ Alt+ Delatau
  • Alt+ PrtSc+ Katau
  • Ctrl+ Alt+F#

tidak ada yang berhasil.

Saya harus mem-boot dari image Ubuntu USB, menemukan rc.local, memberi diri saya izin untuk file dan menghapusnya. Saya kira Anda tidak boleh melakukan hal-hal jika Anda tidak tahu apa yang Anda lakukan.

Gašper Čefarin
sumber