Bagaimana menjalankan script pada start up?

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

Salah satu pendekatannya adalah menambahkan @ reboot cron tugas:

  1. Berlari crontab -e akan memungkinkan Anda untuk mengedit cron Anda.
  2. Menambahkan baris seperti ini ke dalamnya:

    @reboot /path/to/script

    akan mengeksekusi script yang setelah boot komputer Anda.

Tergantung pada jenis script yang Anda butuhkan untuk menjalankan.. Untuk layanan dan sejenisnya Anda harus menggunakan upstart. Tetapi untuk skrip pengguna ini harus diluncurkan sebagai skrip sesi oleh gnome! Silahkan lihat di bawah Sistem > Preferensi & gt; Aplikasi Startup.

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

Untuk 14.04 dan lebih tua

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

start on startuptaskexec /path/to/command

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

Anda dapat menambahkan perintah ke /etc/rc.local:

sudo nano /etc/rc.local

Ini mengeksekusi perintah sebagai root.

Untuk menjalankan perintah sebagai pengguna tertentu, gunakan sudo -i -u (-i untuk juga menjalankan shell login). Misalnya, untuk membuat terowongan SSH persisten, di mana myhost adalah definde dalam johndoes ~/.ssh/config berkas:

sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost

Perhatikan bahwa jika /etc/rc.local tidak ada (seperti halnya pada Ubuntu sejak 16.04), Anda perlu menambahkan shebang line di bagian atas (mis. #!/bin/bash), dan memastikan file dapat dieksekusi:

sudo chmod a+x /etc/rc.local

Untuk 15.04 dan kemudian:

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

[Unit]Description=Job that runs your user script[Service]ExecStart=/some/commandType=oneshotRemainAfterExit=yes[Install]WantedBy=multi-user.target

Kemudian jalankan:

sudo systemctl daemon-reloadsudo systemctl enable foo.service

Pada dasarnya, ini hanya mengkonversi pekerjaan pemula yang khas untuk satu systemd (lihat Systemd untuk pengguna pemula).

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

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

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

Relevan:


Untuk sesi pengguna, Anda dapat membuat unit systemd di ~/.config/systemd sebagai gantinya. Ini harus bekerja dengan 16.04 dan seterusnya, tetapi tidak rilis Ubuntu sebelumnya dengan systemd (karena yang masih digunakan pemula untuk sesi pengguna). Unit sesi pengguna dapat dikontrol dengan perintah yang sama seperti dengan layanan sistem, tetapi dengan --user opsi ditambahkan:

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

Sintaks Shell

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


1Berbeda dengan daemon berumur panjang.

Ada berbagai cara untuk menjalankan perintah secara otomatis:

  1. The upstart sistem akan mengeksekusi semua skrip dari mana ia menemukan konfigurasi di direktori /etc/init. Skrip ini akan berjalan selama startup sistem (atau sebagai respons terhadap peristiwa tertentu, misalnya, permintaan shutdown) dan begitu juga 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 init dan man 8 init memberikan 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 sampai .gnomerc script selesai; oleh karena itu, jika Anda ingin autostart beberapa program lama berjalan, Anda perlu menambahkan & untuk pemanggilan program, untuk melepaskannya dari shell yang sedang berjalan.

  3. Pilihan menu Sistem - & gt; Preferensi- & gt; Aplikasi Startup memungkinkan Anda untuk menentukan aplikasi apa yang harus dimulai ketika sesi grafis Anda dimulai (Ubuntu mendefinisikan beberapa), dan menambah atau menghapusnya sesuai selera anda. Ini memiliki tujuan dan ruang lingkup yang hampir sama .gnomerc script, kecuali Anda tidak perlu tahu sh sintaks (tetapi Anda juga tidak dapat menggunakan sh pemrograman membangun).

$HOME/.config/autostart berisi daftar aplikasi startup. .desktop file dalam folder ini akan dieksekusi pada startup. Ini mungkin memerlukan izin yang dapat dieksekusi (chmod +x startup.desktop).

Contoh contoh untuk .desktop berkas:

[Desktop Entry]Type=ApplicationExec="</path/to/script>"Hidden=falseNoDisplay=falseX-GNOME-Autostart-enabled=trueName=Startup Script

Di sini "</path/to/script>" diganti dengan path ke Anda script.shJika Anda menempatkan script Anda myscript di /usr/local/bin sehingga dapat dieksekusi langsung dengan perintah, Anda dapat menulis myscript alih-alih "</path/to/script>".

Contoh contoh myscript.sh:

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

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

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

Atau Anda dapat menambahkannya ke / etc / init.d / rc.lokal atau membuat upstart pekerjaan jika itu lebih tingkat rendah stuff.

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

cron jawaban dilaksanakan berbeda dari atas sebagai

Jawaban ini masih menggunakan cron tetapi menggunakan metode yang berbeda dari jawaban atas sebagai. Ini berfungsi sejak Ubuntu 16.04 tetapi mungkin didukung lebih cepat. Hanya saja saya mulai menggunakan cron untuk menjalankan pekerjaan saat komputer boot sejak 16.04.

Kapan cron lari?

Dalam komentar seseorang bertanya & quot;Kapan mereka menjalankan?& quot;. Anda dapat memberitahu di syslog / journalctl:

$ journalctl -b | grep cronJan 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-02Jan 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 rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root

Satu hal yang perlu diperhatikan adalah cron dapat email anda status pekerjaan berjalan dan @reboot pekerjaan berjalan begitu awal network manager dan email tidak akan berjalan kecuali Anda menempatkan sleep perintah ke script Anda (s).

Dimana untuk menempatkan script Anda

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

$ ll /etc/cron.dtotal 44drwxr-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 siapkan untuk menjalankan setiap boot:

$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/shPATH=/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-vmlinuzSHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin@reboot   root    touch "/boot/vmlinuz-"`uname -r`

Anda harus menggunakan upstart untuk ini. Upstart digunakan untuk proses Ubuntu yang secara otomatis dimulai. Ini adalah solusi yang disempurnakan seperti sistem lama-V init.d script. Hal ini juga memungkinkan Anda untuk dimasukkan ke dalam prasyarat untuk memulai script Anda (yaitu apakah Anda perlu menjalankan jaringan? dll.)

Jika Anda ingin skrip Anda berjalan sebelum systemd tepat setelah kernel dimulai, AFAIK caranya adalah menambahkan init=/path/to/script ke baris perintah kernel di /boot/grub/grub.cfg atau lebih bukti masa depan membuat entri menu Anda sendiri di /etc/grub.d/40_custom dengan menyalin entri menu dari /boot/grub/grub.cfg dan membuat perubahan yang dibutuhkan (dan berjalan update-grub setelah itu untuk grub untuk menambahkan file kustom Anda ke /boot/grub/grub.cfg).

linux   /boot/vmlinuz-5.4.0-26-generic ... ro  quiet splash 

ubah ke

linux   /boot/vmlinuz-5.4.0-26-generic ... ro  quiet splash init=/path/to/script

Berhati - hatilah untuk menempatkan dengan benar misalnya. #!/bin/bash pada baris pertama dan exec /sbin/init (jika /sbin/init ada di sistem Anda-di milik saya itu menunjuk ke systemd) di bagian akhir untuk menghindari kepanikan kernel.

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 dimulai (seperti X11)

  • 1 untuk @GabrielFair. Sebagian besar masalahnya adalah pertanyaan dan jawaban awal berusia sepuluh tahun. Saya juga menambahkan bahwa ada terlalu banyak cara untuk menyelesaikan masalah ini. Apa yang terjadi dengan kesederhanaan filosofi Unix?! Meminta seseorang * berpengetahuan* dan dengan poin yang cukup menulis ulang posting ini, atau menambahkan baru, up-to-date, jawaban pasti untuk versi os modern.

Seluruh utas jawaban ini berantakan. Format Stack Exchange tampaknya tidak cocok untuk pertanyaan ini