Bagaimana cara menjalankan skrip saat start up?

520

Bagaimana saya bisa menjalankan skrip secara otomatis ketika Ubuntu mulai jadi saya tidak harus menjalankannya secara manual setelah startup?

myusuf3
sumber
3
Jika seseorang juga bisa menunjukkan KAPAN dan DI MANA itu akan luar biasa. Saya mengatakan ini karena saya tahu setidaknya ada 2 cara untuk memulai skrip yang akan diaktifkan sebelum aplikasi lain telah dimulai (seperti X11)
Buttink
1
Seluruh utas jawaban ini berantakan. Format Stack Exchange tampaknya tidak paling cocok untuk pertanyaan ini
Gabriel Fair
1
Ini sebenarnya cukup menghibur. Berapa banyak cara yang berbeda?
devios1

Jawaban:

206

Tergantung pada jenis skrip yang Anda perlu jalankan .. Untuk layanan dan sejenisnya Anda harus menggunakan pemula . Tetapi untuk skrip pengguna, ini harus diluncurkan sebagai skrip sesi oleh gnome! Lihat di bawah System> Preferences> Startup Applications.

Di samping catatan jika Anda memerlukan beberapa skrip untuk dijalankan pada terminal login Anda dapat menambahkannya ke file .bash_login di direktori home Anda.

Untuk 14,04 dan lebih tua

Perintah sederhana (yang tidak perlu tetap berjalan) dapat menggunakan pekerjaan pemula seperti:

start on startup
task
exec /path/to/command

Simpan ini dalam .conffile di /etc/init(jika Anda membutuhkannya untuk menjalankan sebagai root ketika sistem boot up), atau dalam ~/.config/upstart(jika Anda membutuhkannya untuk berjalan sebagai pengguna Anda ketika Anda login).

LassePoulsen
sumber
58
Mempertimbangkan bagaimana SO dan StackExchange berjalan, dapatkah Anda memberikan contoh skrip pemula dan di mana ia akan ditempatkan? Itu akan membuat ini jawaban yang jauh lebih baik. Tautan Anda mengatakan itu tidak dikelola dan untuk melihat buku masak pemula, yang sangat besar. Saya tidak punya banyak ide dari mana harus memulai.
Ehtesh Choudhury
2
Bagaimana jika saya perlu menjalankan perintah sebagai root?
dopatraman
1
@dopatraman Jawabannya menyatakan bahwa semua proses dengan ini dijalankan sebagai root.
AStopher
4
Harap perbarui jawaban ini untuk menjelaskan apa yang harus dilakukan pada sistem yang menjalankan systemd daripada pemula (Ubuntu 15.04+).
3
Jawaban ini tidak masuk akal bagi saya. Aplikasi yang terdaftar di system->pref->startup applicationstidak dapat ditemukan di /etc/init/atau di ~/.config/upstart. Jadi di mana aplikasi startup didefinisikan?
phil294
553

Salah satu pendekatan adalah menambahkan tugas cron @reboot :

  1. Menjalankan crontab -eakan memungkinkan Anda untuk mengedit cron Anda.
  2. Menambahkan baris seperti ini ke dalamnya:

    @reboot /path/to/script
    

    akan menjalankan skrip itu setelah komputer Anda boot.

ceejayoz
sumber
85
Kata @rebootkunci adalah tip yang bagus karena tidak banyak diketahui.
jathanism
12
Bagus. Adakah yang tahu kapan hal ini terjadi?
Oli
2
Jadi ... ini tidak akan berjalan jika saya kehilangan daya dan PC kembali dinyalakan ketika daya pulih?
Mike Wills
18
@siamii: man 5 crontabmengatakan itu @rebootdijalankan saat startup (ketika cron daemon dimulai).
jfs
9
Ini luar biasa. Sejauh ini tampaknya lebih baik daripada rc.localkarena sistem tampaknya lebih diatur pada titik ini (PATH, dll). Sungguh aneh bahwa sangat sulit untuk memanggil sesuatu setelah startup sistem ..
Karthik T
161

Bagaimana dengan menambahkan perintah /etc/rc.local? Anda harus menggunakan akses sudo untuk mengedit file ini.

sudo nano /etc/rc.local
paolo granada lim
sumber
19
Ini paling langsung menjawab pertanyaan: bagaimana cara menjalankan beberapa skrip ketika sistem Anda boot. pemula melakukan tugas yang lebih kompleks: memulai proses daemon.
Dogweather
1
Jadi pemula memulai proses daemon sementara /etc/rc.local memulai skrip bash?
Donato
5
Haruskah itu Ini tidak lagi berfungsi hari ini, kan?
DaVince
4
Doenst bekerja dengan Ubuntu 17.04 systemd
qodeninja
3
Perhatikan bahwa jika Anda membuat file ini sendiri (seperti yang saya lakukan), maka Anda harus mengubah file menjadi executable chmod 755 rc.local, dan menambahkan #!/bin/bashke baris pertama.
psitae
77

Untuk 15,04 dan yang lebih baru:

Untuk menjalankan perintah (berumur pendek) 1 saat menggunakan startup systemd, Anda dapat menggunakan unit tipe sistemd OneShot. Misalnya, buat yang /etc/systemd/system/foo.serviceberisi:

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Lalu lari:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

Pada dasarnya, ini hanya mengonversi pekerjaan pemula yang baru menjadi pekerjaan sistemd (lihat Systemd untuk pengguna pemula ).

Anda dapat menjalankan banyak perintah dari file layanan yang sama, menggunakan beberapa ExecStartbaris:

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure

Perintah harus selalu diberikan dengan path lengkap. Jika ada perintah gagal, sisanya tidak berjalan. A -sebelum path memberitahu systemd untuk mengabaikan status keluar yang bukan nol (alih-alih menganggapnya gagal).

Relevan:


Untuk sesi pengguna, Anda dapat membuat unit systemd ~/.config/systemdsebagai gantinya. Ini harus bekerja dengan 16,04 dan seterusnya, tetapi tidak rilis Ubuntu sebelumnya dengan systemd (karena mereka masih menggunakan Upstart untuk sesi pengguna). Unit sesi pengguna dapat dikontrol dengan perintah yang sama seperti dengan layanan sistem, tetapi dengan --useropsi yang ditambahkan:

systemctl --user daemon-reload
systemctl --user status foo.service

Sintaks shell

Perhatikan bahwa, tidak seperti Pemula, systemd tidak menjalankan Exec*perintah melalui shell. Itu melakukan beberapa ekspansi variabel terbatas dan beberapa perintah (dipisahkan oleh ;) itu sendiri, tapi itu saja sejauh sintaks seperti shell berjalan. Untuk hal yang lebih rumit, katakan pengalihan atau pipa, bungkus perintah Anda di sh -c '...'atau bash -c '...'.


1 Berbeda dengan dasmon berumur panjang.

muru
sumber
apakah mungkin menetapkan prioritas pada pekerjaan? atau menentukan bahwa itu tergantung pada layanan lain yang akan dimulai terlebih dahulu?
r3wt
1
@ r3wt ya, ada berbagai cara untuk melakukan itu. Yang WantedBydigunakan di sini, misalnya, membuatnya mulai ketika multi-user.targettercapai. Anda dapat menggunakan Before, After, Requires, dll Lihatman systemd.unit
Muru
@ BelDuck bukan satu-satunya hal yang kurang. Terima kasih!
muru
Sama-sama. - Btw, RemainAfterExittergantung pada layanan yang Anda mulai dan perilaku yang diinginkan. Misalnya, /bin/df -h<s> akan </s> seharusnya RemainAfterExit=no.
PerlDuck
@PerlDuck Tidak ada yang melekat dalam dfkebutuhan itu RemainAfterExit=no. Kecuali Anda ingin menjalankan perintah berulang kali setiap kali Anda menjalankan systemctl start foo.
muru
71

Ada berbagai cara untuk menjalankan perintah secara otomatis:

  1. Sistem pemula akan menjalankan semua skrip dari mana ia menemukan konfigurasi dalam direktori /etc/init. Skrip-skrip ini akan berjalan selama startup sistem (atau sebagai respons terhadap peristiwa-peristiwa tertentu, misalnya, permintaan penutupan) dan demikian pula tempat untuk menjalankan perintah yang tidak berinteraksi dengan pengguna; semua server mulai menggunakan mekanisme ini.

    Anda dapat menemukan pengantar yang dapat dibaca di: http://upstart.ubuntu.com/getting-started.html halaman manual man 5 initdan man 8 initberikan rincian lengkapnya kepada Anda.

  2. Sebuah skrip shell bernama .gnomercdi direktori home Anda secara otomatis bersumber setiap kali Anda masuk ke sesi GNOME. Anda dapat menempatkan perintah sewenang-wenang di sana; variabel lingkungan yang Anda atur dalam skrip ini akan dilihat oleh program apa pun yang Anda jalankan di sesi Anda.

    Perhatikan bahwa sesi tidak dimulai sampai .gnomercskrip selesai; oleh karena itu, jika Anda ingin melakukan autostart pada beberapa program yang sudah berjalan lama, Anda perlu menambahkan &permintaan program, untuk melepaskannya dari shell yang sedang berjalan.

  3. Opsi menu System -> Preferences -> Startup Applications memungkinkan Anda untuk menentukan aplikasi apa yang harus dimulai ketika sesi grafis Anda dimulai (Ubuntu sudah cukup banyak mendefinisikannya), dan menambah atau menghapusnya sesuai selera Anda. Ini memiliki tujuan dan cakupan .gnomercskrip yang hampir sama , kecuali Anda tidak perlu tahu shsintaks (tetapi Anda juga tidak dapat menggunakan shkonstruk pemrograman apa pun ).

Riccardo Murri
sumber
11
3) "Ini memiliki tujuan dan ruang lingkup yang hampir sama dari skrip .gnomerc", kecuali .gnomerctampaknya berjalan sebelum memuat Unity, dan Startup Applicationstampaknya berjalan setelah memuat Unity. Saya harus menjalankan program yang duduk di menu bar Unity dan itu membuat perbedaan besar dalam hal ini!
Orang Brazil itu
1
@ ruda.almeida Terima kasih telah menunjukkannya. Jawabannya ditulis pada masa pra-Persatuan.
Riccardo Murri
1
sudo update-rc.d myscript.sh defaults, di mana /etc/init.d/myscript.sh adalah skrip Anda, juga menjalankannya saat startup.
Dan Dascalescu
27
$HOME/.config/autostart
  • Lokasi ini berisi daftar aplikasi startup.
  • .desktop file dapat diletakkan di sini yang akan dieksekusi saat startup.

Contoh contoh untuk .desktopfile:

Masukkan dan berikan .desktopfile berikut :$HOME/.config/autostartchmod +x

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

Di sini "</path/to/script>"diganti dengan path ke Anda script.sh
(biasanya disarankan /usr/local/binagar-yang dapat dieksekusi dengan perintah langsung katakan myscriptdiganti dengan "</path/to/script>").

Contoh contoh dari script.sh:

#!/bin/bash
<commands to be executed>
exit

Hasil: .desktopfile akan diluncurkan dari $HOME/.config/autostartyang menjalankan skrip olehExec=

Karenanya, Anda dapat menjalankan skrip shell yang Anda inginkan saat startup!

Pandya
sumber
18

Untuk hal-hal sederhana, Anda dapat menambahkan perintah di System-> Preferences-> Sesi yang menunjuk ke lokasi skrip Anda.

Atau Anda dapat menambahkannya ke /etc/init.d/rc.local atau melakukan pekerjaan pemula jika itu adalah hal yang lebih rendah .

Lihatlah https://help.ubuntu.com/community/UbuntuBootupHowto untuk info lebih lanjut

tutuca
sumber
7

cron jawaban yang diterapkan berbeda dengan yang terpilih

Jawaban ini masih menggunakan crontetapi menggunakan metode yang berbeda dari jawaban yang dipilih teratas. Ini berfungsi sejak Ubuntu 16.04 tetapi mungkin didukung lebih cepat. Hanya saja saya mulai menggunakan cronuntuk menjalankan pekerjaan ketika komputer dinyalakan sejak 16.04.

Kapan cronlari?

Dalam komentar seseorang bertanya "kapan mereka berlari?". Anda dapat memberi tahu di syslog / journalctl:

$ journalctl -b | grep cron
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)
Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[985]: (root) CMD (   /usr/local/bin/cron-reboot-cycle-grub-background)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root

Satu hal yang perlu diperhatikan adalah crondapatkah Anda mengirim email status pekerjaan yang dijalankan dan @rebootpekerjaan yang dijalankan sehingga pengelola jaringan dan email awal tidak akan berjalan kecuali jika Anda memasukkan sleepperintah ke dalam skrip Anda.

Tempat meletakkan skrip Anda

Letakkan skrip Anda di direktori /etc/cron.d:

$ ll /etc/cron.d
total 44
drwxr-xr-x   2 root root  4096 Nov 26 19:53 ./
drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../
-rw-r--r--   1 root root   244 Dec 28  2014 anacron
-rw-r--r--   1 root root   148 Feb 18  2017 cycle-grub-background
-rw-r--r--   1 root root   138 Mar  5  2017 display-auto-brightness
-rw-r--r--   1 root root   460 Nov 26 19:53 nvidia-hdmi-sound
-rw-r--r--   1 root root   102 Feb  9  2013 .placeholder
-rw-r--r--   1 root root   224 Nov 19  2016 touch-vmlinuz
-rw-r--r--   1 root root   700 Aug  5 11:15 turn-off-hyper-threading

Seperti apa bentuk skrip?

Berikut adalah beberapa skrip yang saya siapkan untuk menjalankan setiap boot:

$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
@reboot   root    /usr/local/bin/cron-reboot-cycle-grub-background

$ cat /etc/cron.d/touch-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    touch "/boot/vmlinuz-"`uname -r`
WinEunuuchs2Unix
sumber
1
Ada banyak cara berbeda untuk menambahkan cronjobs, tetapi inti dari jawaban yang sangat banyak dipilih dan jawaban Anda masih tetap @reboot.
muru
Metode alternatif untuk menambahkan crontab harus diposting ke askubuntu.com/q/2368/158442 , yang secara eksplisit tentang menambahkan pekerjaan Cron.
muru
1
Saya mohon untuk berbeda. Inti dari jawaban yang dipermasalahkan menggunakan crontab -eyang oleh sebagian orang dianggap sebagai salah satu seni hitam karena antarmuka yang mirip vim. Di sisi lain jawaban ini mungkin menarik bagi mereka yang otaknya terhubung dengan cara tertentu. Kita tidak semua dilemparkan dari cetakan yang sama. Kemudian lagi jawaban ini sudah memiliki satu suara sehingga kami akan membiarkan demokrasi mengambil jalannya.
WinEunuuchs2Unix
2
Bisa aja. Anda dan saya sama-sama tahu bahwa editor dapat diubah.
muru
@uru Ya mungkin karena Anda mengajari saya dan saya belajar mengubah editor menjadi sesuatu seperti nano atau beberapa CLI lainnya. Tapi aku di kamp gedit. Selain crontab -ememunculkan asterisk ("*") kenangan selama beberapa menit, jam, dll. Saya selalu menemukan bahwa saya perlu petunjuk untuk google. Saya masih menemukan penggunaan /etc/cron.ddan /etc/cron.dailypilihan saya. Terutama karena itu cermin /etc/udev/rules.ddan /etc/systemd/system-sleepmetode. Sepertinya cocok.
WinEunuuchs2Unix
5

Anda harus menggunakan pemula untuk ini. Pemula digunakan untuk proses Ubuntu yang secara otomatis dimulai. Ini adalah solusi yang disempurnakan seperti skrip init.d System-V lama. Ini juga memungkinkan Anda untuk memasukkan prasyarat ke awal skrip Anda (yaitu apakah Anda memerlukan jaringan berjalan? Dll.)

txwikinger
sumber