Bagaimana saya bisa menjalankan skrip secara otomatis ketika Ubuntu mulai jadi saya tidak harus menjalankannya secara manual setelah startup?
Bagaimana saya bisa menjalankan skrip secara otomatis ketika Ubuntu mulai jadi saya tidak harus menjalankannya secara manual setelah startup?
Jawaban:
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.
Perintah sederhana (yang tidak perlu tetap berjalan) dapat menggunakan pekerjaan pemula seperti:
start on startup
task
exec /path/to/command
Simpan ini dalam .conf
file 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).
system->pref->startup applications
tidak dapat ditemukan di /etc/init/
atau di ~/.config/upstart
. Jadi di mana aplikasi startup didefinisikan?
Salah satu pendekatan adalah menambahkan tugas cron @reboot :
crontab -e
akan memungkinkan Anda untuk mengedit cron Anda.Menambahkan baris seperti ini ke dalamnya:
@reboot /path/to/script
akan menjalankan skrip itu setelah komputer Anda boot.
@reboot
kunci adalah tip yang bagus karena tidak banyak diketahui.
man 5 crontab
mengatakan itu @reboot
dijalankan saat startup (ketika cron daemon dimulai).
rc.local
karena sistem tampaknya lebih diatur pada titik ini (PATH, dll). Sungguh aneh bahwa sangat sulit untuk memanggil sesuatu setelah startup sistem ..
Bagaimana dengan menambahkan perintah /etc/rc.local
? Anda harus menggunakan akses sudo untuk mengedit file ini.
sudo nano /etc/rc.local
chmod 755 rc.local
, dan menambahkan #!/bin/bash
ke baris pertama.
Untuk menjalankan perintah (berumur pendek) 1 saat menggunakan startup systemd
, Anda dapat menggunakan unit tipe sistemd OneShot
. Misalnya, buat yang /etc/systemd/system/foo.service
berisi:
[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 ExecStart
baris:
[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/systemd
sebagai 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 --user
opsi yang ditambahkan:
systemctl --user daemon-reload
systemctl --user status foo.service
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.
WantedBy
digunakan di sini, misalnya, membuatnya mulai ketika multi-user.target
tercapai. Anda dapat menggunakan Before
, After
, Requires
, dll Lihatman systemd.unit
RemainAfterExit
tergantung pada layanan yang Anda mulai dan perilaku yang diinginkan. Misalnya, /bin/df -h
<s> akan </s> seharusnya RemainAfterExit=no
.
df
kebutuhan itu RemainAfterExit=no
. Kecuali Anda ingin menjalankan perintah berulang kali setiap kali Anda menjalankan systemctl start foo
.
Ada berbagai cara untuk menjalankan perintah secara otomatis:
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 init
dan man 8 init
berikan rincian lengkapnya kepada Anda.
Sebuah 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 atur dalam skrip ini akan dilihat oleh program apa pun yang Anda jalankan di sesi Anda.
Perhatikan bahwa sesi tidak dimulai sampai .gnomerc
skrip 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.
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 .gnomerc
skrip yang hampir sama , kecuali Anda tidak perlu tahu sh
sintaks (tetapi Anda juga tidak dapat menggunakan sh
konstruk pemrograman apa pun ).
.gnomerc
tampaknya berjalan sebelum memuat Unity, dan Startup Applications
tampaknya berjalan setelah memuat Unity. Saya harus menjalankan program yang duduk di menu bar Unity dan itu membuat perbedaan besar dalam hal ini!
sudo update-rc.d myscript.sh defaults
, di mana /etc/init.d/myscript.sh adalah skrip Anda, juga menjalankannya saat startup.
$HOME/.config/autostart
.desktop
file dapat diletakkan di sini yang akan dieksekusi saat startup.Contoh contoh untuk .desktop
file:
Masukkan dan berikan .desktop
file berikut :$HOME/.config/autostart
chmod +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/bin
agar-yang dapat dieksekusi dengan perintah langsung katakan myscript
diganti 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 menjalankan skrip olehExec=
Karenanya, Anda dapat menjalankan skrip shell yang Anda inginkan saat startup!
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
cron
jawaban yang diterapkan berbeda dengan yang terpilihJawaban ini masih menggunakan cron
tetapi 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 cron
untuk menjalankan pekerjaan ketika komputer dinyalakan sejak 16.04.
cron
lari?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
dapatkah Anda mengirim email status pekerjaan yang dijalankan dan @reboot
pekerjaan yang dijalankan sehingga pengelola jaringan dan email awal tidak akan berjalan kecuali jika Anda memasukkan sleep
perintah ke dalam 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
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`
@reboot
.
crontab -e
yang 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.
crontab -e
memunculkan asterisk ("*") kenangan selama beberapa menit, jam, dll. Saya selalu menemukan bahwa saya perlu petunjuk untuk google. Saya masih menemukan penggunaan /etc/cron.d
dan /etc/cron.daily
pilihan saya. Terutama karena itu cermin /etc/udev/rules.d
dan /etc/systemd/system-sleep
metode. Sepertinya cocok.
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.)