Pertanyaan Bagaimana cara menjalankan skrip saat memulai?


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


456
2017-08-04 19:54


asal


Jika seseorang juga bisa menunjukkan KAPAN dan MANA yang akan luar biasa. Saya mengatakan ini karena saya tahu setidaknya ada 2 cara untuk memulai skrip yang akan diaktifkan sebelum aplikasi lain dimulai (seperti X11) - Buttink
Seluruh utas jawaban ini berantakan. Format Stack Exchange sepertinya tidak cocok untuk pertanyaan ini - Gabriel Fair
Sebenarnya cukup menghibur. Ada berapa banyak cara yang berbeda? - devios1


Jawaban:


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

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

Untuk 14,04 tahun ke atas

Perintah sederhana (yang tidak perlu tetap berjalan) dapat menggunakan tugas yang baru dimulai seperti:

start on startup
task
exec /path/to/command

Simpan ini dalam .conf file di /etc/init (jika Anda perlu menjalankannya sebagai root saat sistem boot), atau masuk ~/.config/upstart (jika kamu memerlukannya untuk dijalankan sebagai pengguna saat Anda masuk).


191
2017-08-04 23:26



Mempertimbangkan bagaimana SO dan StackExchange berjalan, dapatkah Anda memberikan contoh skrip pemula dan di mana itu akan ditempatkan? Itu akan membuat ini menjadi jawaban yang jauh lebih baik. Tautan Anda mengatakan itu tidak dipelihara dan untuk melihat buku masak pemula, yang merupakan huuuge. Saya tidak punya terlalu banyak ide dari mana harus memulai. - Ehtesh Choudhury
Bagaimana jika saya harus menjalankan perintah sebagai root? - dopatraman
@dopatraman Jawabannya menyatakan bahwa semua proses dengan ini dijalankan sebagai root. - cybermonkey
Harap perbarui jawaban ini untuk menjelaskan apa yang harus dilakukan pada sistem yang menjalankan sistem daripada upstart (Ubuntu 15.04+).
Jawaban ini tidak masuk akal bagi saya. Aplikasi yang terdaftar di system->pref->startup applications tidak dapat ditemukan di /etc/init/ tidak juga ~/.config/upstart. Begitu di mana aplikasi startup didefinisikan? - Blauhirn


Salah satu pendekatannya adalah dengan menambahkan @reboot cron tugas:

  1. Lari crontab -e akan memungkinkan Anda untuk mengedit cron Anda.
  2. Menambahkan garis seperti ini padanya:

    @reboot /path/to/script
    

    akan menjalankan skrip itu setelah komputer Anda boot.


476
2017-08-04 19:57



Itu @reboot kata kunci adalah tip yang bagus karena tidak banyak dikenal. - jathanism
Bagus. Ada ide kapan tepatnya ini memicu? - Oli♦
Jadi ... ini tidak akan berjalan jika saya kehilangan daya dan PC berputar lagi ketika listrik dipulihkan? - Mike Wills
@siamii: man 5 crontab mengatakan itu @reboot dijalankan saat startup (ketika cron daemon dimulai). - jfs
Ini luar biasa. Sejauh ini tampaknya lebih baik daripada rc.local karena sistem tampaknya lebih banyak pengaturan pada titik ini (PATH, dll). Sangat aneh bahwa sangat sulit untuk memanggil sesuatu setelah startup sistem .. - Karthik T


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

sudo nano /etc/rc.local

135
2017-08-05 16:40



Ini secara langsung menjawab pertanyaan: bagaimana menjalankan beberapa skrip ketika boot sistem Anda. pemula memulai tugas yang lebih rumit: memulai proses daemon. - Dogweather
Jadi pemula memulai proses daemon sementara /etc/rc.local memulai skrip bash? - Donato
Ini harus menjadi jawaban yang diterima ... - Android Dev
Haruskah itu? Ini tidak lagi berfungsi hari ini, kan? - DaVince
Doenst bekerja dengan Ubuntu 17.04 systemd - qodeninja


Ada berbagai cara untuk menjalankan perintah secara otomatis:

  1. Itu pemula sistem akan menjalankan semua skrip dari mana ia menemukan konfigurasi dalam direktori /etc/init. Skrip ini akan berjalan saat startup sistem (atau sebagai tanggapan terhadap peristiwa tertentu, misalnya permintaan shutdown) dan begitu juga tempat 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 init dan man 8 init memberi Anda rincian lengkap.

  2. Skrip shell bernama .gnomerc di 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 tetapkan dalam skrip ini akan dilihat oleh program apa pun yang Anda jalankan di sesi Anda.

    Perhatikan bahwa sesi tidak dimulai hingga .gnomerc skrip selesai; Oleh karena itu, jika Anda ingin menjalankan program yang lama berjalan, Anda perlu menambahkan & ke pemanggilan program, untuk melepaskannya dari shell yang sedang berjalan.

  3. Opsi menu System -> Preferences -> Startup Applications memungkinkan Anda menentukan aplikasi apa yang harus dimulai ketika sesi grafis Anda dimulai (Ubuntu menentukan beberapa), dan menambahkan atau menghapusnya sesuai selera Anda. Ini hampir memiliki tujuan dan ruang lingkup yang sama .gnomerc skrip, kecuali Anda tidak perlu tahu sh sintaks (tetapi Anda juga tidak bisa menggunakannya sh pembuatan program).


68
2017-08-05 14:02



3) "Ini memiliki tujuan dan cakupan skrip .gnomerc yang hampir sama", kecuali .gnomerc ternyata berjalan sebelum memuat Unity, dan Startup Applications ternyata berjalan setelah memuat Unity. Saya harus menjalankan program yang terletak di bar menu Unity dan itu membuat perbedaan besar dalam hal ini! - That Brazilian Guy
@ ruda.almeida Terima kasih telah menunjukkan hal itu. Jawabannya ditulis pada masa pra-kesatuan. - Riccardo Murri
sudo update-rc.d myscript.sh defaults, di mana /etc/init.d/myscript.sh adalah skrip Anda, juga menjalankannya saat startup. - Dan Dascalescu


Untuk 15.04 dan lebih baru:

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

[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 mengubah pekerjaan Upstart yang khas ke sistemd (lihat Systemd untuk pengguna pemula).

Anda dapat menjalankan beberapa perintah dari file layanan yang sama, menggunakan beberapa ExecStart garis:

[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. SEBUAH - sebelum jalan memberitahu systemd untuk mengabaikan status keluar non-nol (bukannya menganggapnya sebagai kegagalan).

Relevan:


Untuk sesi pengguna, Anda dapat membuat unit sistemd dalam ~/.config/systemd sebagai gantinya. Ini harus bekerja dengan 16.04 dan seterusnya, tetapi tidak rilis Ubuntu lebih awal 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 --user opsi ditambahkan:

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

1Berbeda dengan daemon yang berumur panjang.


53
2018-01-09 19:21



apakah mungkin untuk menetapkan prioritas pada pekerjaan? atau menentukan bahwa itu tergantung pada layanan lain yang harus dimulai lebih dulu? - r3wt
@ r3wt ya, ada berbagai cara untuk melakukannya. Itu WantedBy digunakan di sini, misalnya, membuatnya mulai saat multi-user.target tercapai. Kamu dapat memakai Before, After, Requires, dll. Lihat man systemd.unit - muru
@PerlDuck bukan satu-satunya hal yang kurang. Terima kasih! - muru
Sama-sama. - Btw, the RemainAfterExit tergantung pada layanan yang Anda mulai dan perilaku yang diinginkannya. Contohnya, /bin/df -h <s> akan </ s> seharusnya RemainAfterExit=no. - PerlDuck
@PerlDuck Tidak ada yang melekat df kebutuhan itu RemainAfterExit=no. Kecuali Anda ingin berulang kali menjalankan perintah setiap kali Anda menjalankannya systemctl start foo. - muru


$HOME/.config/autostart
  • Lokasi ini berisi daftar aplikasi startup.
  • .desktop file dapat diletakkan di sini yang akan dieksekusi saat startup.

Contoh contoh untuk .desktop mengajukan:

Puting mengikuti .desktop file di $HOME/.config/autostart dan diberikan chmod +x:

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

Sini "</path/to/script>" diganti dengan jalur ke Anda script.sh
(biasanya disarankan untuk /usr/local/bin jadi-itu bisa dieksekusi dengan perintah langsung katakan myscript digantikan dengan "</path/to/script>").

Contoh contoh dari script.sh:

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

Hasil: .desktop file akan diluncurkan dari $HOME/.config/autostart yang mengeksekusi skrip oleh Exec=

Oleh karena itu, Anda dapat menjalankan skrip shell yang Anda inginkan saat startup!


22
2017-07-20 06:14





Untuk hal-hal sederhana, Anda dapat menambahkan perintah Sistem-> Preferensi-> Sesi menunjuk ke lokasi skrip Anda.

Atau Anda dapat menambahkannya ke /etc/init.d/rc.local atau membuat pemula pekerjaan jika itu lebih level rendah barang.

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


18
2017-08-04 19:59





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


5
2017-08-04 19:58





cron Jawaban diimplementasikan berbeda dari atas yang memilih

Jawaban ini masih digunakan cron tetapi menggunakan metode yang berbeda dari jawaban suara teratas. Ini bekerja sejak Ubuntu 16.04 tetapi mungkin didukung lebih cepat. Hanya saja saya mulai menggunakannya cron untuk menjalankan pekerjaan saat komputer boot sejak 16.04.

Kapan cron menjalankan?

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 cron dapat mengirim email kepada Anda tentang status pekerjaan yang dijalankan dan @reboot pekerjaan yang dijalankan oleh pengelola jaringan dan email sangat awal tidak akan berjalan kecuali Anda meletakkannya sleep perintah ke skrip Anda (s).

Di mana menaruh skrip Anda

Masukkan 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 naskah itu?

Berikut adalah beberapa skrip yang saya atur 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`

3
2018-01-03 01:02



Ada banyak cara yang berbeda untuk menambahkan cronjobs, tetapi inti dari jawaban yang sangat dipilih dan jawaban Anda masih @reboot. - muru
Metode alternatif untuk menambahkan crontabs harus diposkan askubuntu.com/q/2368/158442, yang secara eksplisit tentang menambahkan pekerjaan Cron. - muru
Saya mohon untuk berbeda. Inti dari jawaban tersebut digunakan crontab -e yang beberapa menganggap salah satu seni hitam karena antarmuka seperti vim. Di sisi lain, jawaban ini mungkin menarik bagi mereka yang memiliki otak dengan cara tertentu. Kita tidak semuanya dilemparkan dari cetakan yang sama. Kemudian lagi jawaban ini sudah memiliki satu suara ke bawah sehingga kita akan membiarkan demokrasi mengambil jalannya. - WinEunuuchs2Unix
Bisa aja. Anda dan saya sama-sama tahu bahwa editor dapat diubah. - muru
@muru Ya mungkin karena Anda mengajari saya dan saya belajar mengubah editor menjadi sesuatu seperti nano atau beberapa CLI lain. Tapi saya di kamp gedit. Selain crontab -e memunculkan kenangan tanda bintang ("*") selama beberapa menit, jam, dll. Saya selalu menemukan bahwa saya perlu petunjuk Google untuk. Saya masih menemukan menggunakan /etc/cron.d dan /etc/cron.daily saya pergi ke pilihan. Terutama karena cermin /etc/udev/rules.d dan /etc/systemd/system-sleep metode. Sepertinya cocok. - WinEunuuchs2Unix