Ubuntu başladığında scriptleri otomatik olarak nasıl çalıştırabilirim ki başlangıçtan sonra bunları manuel olarak çalıştırmak zorunda kalmam?
Ubuntu başladığında scriptleri otomatik olarak nasıl çalıştırabilirim ki başlangıçtan sonra bunları manuel olarak çalıştırmak zorunda kalmam?
Yanıtlar:
Ne tür komut dosyalarını çalıştırmanız gerektiğine bağlı olarak .. Servisler ve benzerleri için upstart kullanmanız gerekir . Ancak bir kullanıcı betiği için bunlar gnome tarafından oturum betiği olarak başlatılmalıdır! Sistem> Tercihler> Başlangıç Uygulamaları bölümüne bakın.
Yan bir notta, terminal girişinde çalıştırılacak bazı komut dosyalarına ihtiyacınız varsa, bunları giriş dizininizdeki .bash_login dosyasına ekleyebilirsiniz .
Basit bir komut (çalışmaya devam etmesi gerekmeyen bir) aşağıdaki gibi bir Upstart işini kullanabilir:
start on startup
task
exec /path/to/command
Bunu bir .conf
dosyaya kaydedin /etc/init
(sistem önyüklenirken kök olarak çalışması gerekiyorsa) veya içeri girin ~/.config/upstart
(oturum açtığınızda kullanıcı olarak çalıştırılması gerekiyorsa).
system->pref->startup applications
içinde /etc/init/
veya içinde bulunamadı ~/.config/upstart
. Peki , başlangıç uygulamaları nerede tanımlanmaktadır?
Bir yaklaşım bir @reboot cron görevi eklemektir :
crontab -e
, cron'unuzu düzenlemenize izin verir.Buna böyle bir satır eklemek:
@reboot /path/to/script
Bilgisayarınız başlatıldığında bu betiği çalıştıracaktır.
@reboot
Yaygın olarak bilinmemektedir çünkü anahtar kelime güzel bir ucu.
man 5 crontab
bunun @reboot
başlangıçta çalıştırıldığını söylüyor (cron daemon başlatıldığında).
rc.local
, sistemin bu noktada (PATH, vb.) Daha fazla kurulum göründüğünden daha iyi görünüyor. Sistem başlangıcından sonra bir şey aramak çok zor ..
Komutu eklemeye ne dersiniz /etc/rc.local
? Bu dosyayı düzenlemek için sudo erişimi kullanmanız gerekecek.
sudo nano /etc/rc.local
chmod 755 rc.local
eklemeniz #!/bin/bash
gerekeceğini unutmayın.
(Kısa ömürlü) 1 komutunu başlangıçta kullanarak çalıştırmak için systemd
, bir systemd tipi tür kullanabilirsiniz OneShot
. Örneğin, /etc/systemd/system/foo.service
içerenler oluşturun :
[Unit]
Description=Job that runs your user script
[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
O zaman koş:
sudo systemctl daemon-reload
sudo systemctl enable foo.service
Temel olarak, bu sadece tipik bir Upstart işini sistemd bir işe dönüştürmektir (bkz . Upstart kullanıcıları için Systemd ).
Birden fazla ExecStart
satır kullanarak aynı servis dosyasından birden fazla komut çalıştırabilirsiniz :
[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure
Komut her zaman tam yolla verilmelidir. Herhangi bir komut başarısız olursa, gerisi çalışmaz. -
Yol, A'dan önce sisteme sıfır olmayan bir çıkış durumunu (görmezden gelmek yerine) görmezden gelmesini söyler.
İlgili:
Kullanıcı oturumları için ~/.config/systemd
yerine systemd birimini oluşturabilirsiniz . Bu daha sonra 16.04 ile çalışmalıdır, ancak daha önce Ubuntu'nun systemd ile yayınlanmaması gerekir (çünkü kullanıcı oturumları için hala Upstart kullanıyordu). Kullanıcı oturum birimleri, sistem servislerinde olduğu gibi aynı komutlarla kontrol edilebilir, ancak --user
seçenek eklendi:
systemctl --user daemon-reload
systemctl --user status foo.service
Upstart'ın aksine, systemd'nin Exec*
komutları bir kabuk üzerinde çalıştırmadığını unutmayın . Bazı sınırlı değişken genişleme ve çoklu komut (tarafından ayrılmış ;
) kendisi gerçekleştirir, ancak bu, kabuk benzeri sözdiziminde olduğu gibi onunla ilgilidir. Daha karmaşık bir şey için, yönlendirme veya borular söyleyin, komutunuzu sh -c '...'
veya içine alın bash -c '...'
.
1 Uzun ömürlü iblislerin aksine.
WantedBy
Örneğin ne zaman başladı yapar, burada kullanılan multi-user.target
ulaşılır. Sen kullanabilirsiniz Before
, After
, Requires
bakınız, vbman systemd.unit
RemainAfterExit
başlattığınız servise ve istediğiniz davranışa bağlıdır. Örneğin, /bin/df -h
<s> olur </s> olmalıdır RemainAfterExit=no
.
df
Bu ihtiyaçların doğasında hiçbir şey yok RemainAfterExit=no
. Her çalıştırışta komutu tekrar tekrar çalıştırmak istemiyorsanız systemctl start foo
.
Komutları otomatik olarak çalıştırmanın farklı yolları vardır:
Sonradan görme sistemi dizininde bir yapılandırma bulur hangi tüm komut dosyalarını çalıştırır /etc/init
. Bu komut dosyaları, sistem başlangıcında (veya bir kapatma isteği gibi belirli olaylara yanıt olarak) çalışır ve kullanıcıyla etkileşime girmeyen komutları çalıştıracak yerlerdir; tüm sunucular bu mekanizmayı kullanmaya başlar.
Okunabilir bir girişi şu adreste bulabilirsiniz: http://upstart.ubuntu.com/getting-started.html man sayfaları man 5 init
ve man 8 init
tüm ayrıntıları size verir.
Bir .gnomerc
GNOME oturumuna her giriş yaptığınızda, giriş dizininizdeki bir kabuk betiği otomatik olarak alınır. İsteğe bağlı komutları oraya koyabilirsiniz; Bu komut dosyasında ayarladığınız ortam değişkenleri, oturumunuzda çalıştırdığınız herhangi bir program tarafından görülecektir.
.gnomerc
Komut dosyası tamamlanana kadar oturumun başlamadığını unutmayın ; bu nedenle, bazı uzun süren programları otomatik olarak başlatmak istiyorsanız &
, çalışan kabuğundan ayırmak için program çağrısına eklemeniz gerekir .
Sistem -> Tercihler -> Başlangıç Uygulamaları menü seçeneği , grafiksel oturumunuz başladığında hangi uygulamaların başlatılacağını tanımlamanıza izin verir (Ubuntu bazılarını önceden tanımlıyor) ve zevkinize bunları ekleyip çıkartın. Bu, .gnomerc
komut dizisinin neredeyse aynı amacı ve kapsamına sahiptir , ancak sh
sözdizimini bilmenize gerek yoktur (ancak hiçbir sh
programlama yapısını kullanamazsınız ).
.gnomerc
görünen ve Unity'yi yükledikten sonra görünen şekilde çalışan . Unity'nin menü çubuğunda oturan bir program çalıştırmak zorunda kaldım ve bu durumda çok büyük bir fark yarattı! Startup Applications
sudo update-rc.d myscript.sh defaults
, nerede /etc/init.d/myscript.sh betiğinizdir, başlangıçta da çalıştırılır.
$HOME/.config/autostart
.desktop
Burada başlangıçta yürütülecek dosya koyulabilir..desktop
Dosya için örnek örnek :
Aşağıdaki .desktop
dosyayı koymak $HOME/.config/autostart
ve vermek chmod +x
:
[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script
İşte "</path/to/script>"
sizin yolunuzla değiştirilir script.sh
(genellikle /usr/local/bin
bununla myscript
değiştirilir, doğrudan komutla değiştirilerek çalıştırılabilir "</path/to/script>"
).
Örnek bir örnek script.sh
:
#!/bin/bash
<commands to be executed>
exit
Sonuç:
komut dosyası tarafından çalıştırılan .desktop
dosya başlatılacak$HOME/.config/autostart
Exec=
Dolayısıyla istediğiniz kabuk betiğini başlangıçta çalıştırabilirsiniz!
Basit şeyler için, Komut Dosyanızın yerini belirten Sistem-> Tercihler-> Oturumlar'a bir komut ekleyebilirsiniz .
Alternatif olarak /etc/init.d/rc.local dosyasına ekleyebilir veya daha düşük seviyeli bir şeyse işe başlama işi yapabilirsiniz .
Daha fazla bilgi için https://help.ubuntu.com/community/UbuntuBootupHowto adresini ziyaret edin .
cron
Yanıt, üst oydan farklı olarak uygulandıBu cevap hala kullanır cron
ancak en çok oylanan cevaptan farklı bir yöntem kullanır. Bu Ubuntu 16.04’ten bu yana işe yarıyor ama muhtemelen daha önce de destekleniyor. Sadece cron
16.04'ten beri bilgisayar açıldığında işleri çalıştırmak için kullanmaya başladım .
cron
koşar?Yorumlarda birisi "ne zaman koşarlar?" Diye sordu. Syslog / journalctl 'de söyleyebilirsiniz:
$ 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
Unutulmaması gereken bir şey, cron
çalışan işlerin durumunu ve @reboot
işlerin bu kadar erken çalıştığını e-postayla gönderebilmektir, böylece sleep
komut yöneticinize bir komut koymazsanız, ağ yöneticisi ve e-posta çalışmayacaktır .
Komut dosyalarınızı dizine yerleştirin /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
Her önyüklemeyi çalıştırmak için kurulumum olan birkaç betik:
$ 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
bazılarının vim benzeri bir arayüze bağlı olarak siyah sanatlardan birini düşündüğünü kullanır . Öte yandan, bu cevap beyinleri belli bir şekilde bağlanmış olanlara hitap edebilir. Hepimiz aynı kalıptan değiliz. Sonra yine bu cevabın zaten bir oyu yok, demokrasinin yoluna gitmesine izin vereceğiz.
crontab -e
her zaman bulduğum dakikalar, saatler vb. İçin yıldız işaretlerini ("*") hatırlatır. Kullanmayı hala buluyorum /etc/cron.d
ve /etc/cron.daily
seçimime gidiyorum. Özellikle de aynaları /etc/udev/rules.d
ve /etc/systemd/system-sleep
yöntemleri. Sadece güzel bir uyum gibi görünüyor.
Bunun için upstart kullanmalısınız . Upstart, otomatik olarak başlatılan Ubuntu işlemleri için kullanılır. Eski System-V init.d scriptleri gibi gelişmiş bir çözümdür. Ayrıca betiğinizin başına önkoşullar koymanıza izin verir (ör. Ağın çalışmasına mı ihtiyacınız var? Vb.)