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:
- Berlari
crontab -e
akan memungkinkan Anda untuk mengedit cron Anda. -
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 johndoe
s ~/.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:
-
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
danman 8 init
memberikan rincian lengkap. -
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. 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 tahush
sintaks (tetapi Anda juga tidak dapat menggunakansh
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.sh
Jika 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