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 .confdosyaya 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 applicationsiç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.
@rebootYaygın olarak bilinmemektedir çünkü anahtar kelime güzel bir ucu.
man 5 crontabbunun @rebootbaş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.localeklemeniz #!/bin/bashgerekeceğ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.serviceiç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 ExecStartsatı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/systemdyerine 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 --userseç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.targetulaşılır. Sen kullanabilirsiniz Before, After, Requiresbakınız, vbman systemd.unit
RemainAfterExitbaş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.
dfBu 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 initve man 8 inittüm ayrıntıları size verir.
Bir .gnomercGNOME 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.
.gnomercKomut 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, .gnomerckomut dizisinin neredeyse aynı amacı ve kapsamına sahiptir , ancak shsözdizimini bilmenize gerek yoktur (ancak hiçbir shprogramlama 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..desktopDosya için örnek örnek :
Aşağıdaki .desktopdosyayı koymak $HOME/.config/autostartve 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/binbununla myscriptdeğ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 .desktopdosya başlatılacak$HOME/.config/autostartExec=
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 cronancak 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 cron16.04'ten beri bilgisayar açıldığında işleri çalıştırmak için kullanmaya başladım .
cronkoş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 @rebootişlerin bu kadar erken çalıştığını e-postayla gönderebilmektir, böylece sleepkomut 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 -ebazı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 -eher zaman bulduğum dakikalar, saatler vb. İçin yıldız işaretlerini ("*") hatırlatır. Kullanmayı hala buluyorum /etc/cron.dve /etc/cron.dailyseçimime gidiyorum. Özellikle de aynaları /etc/udev/rules.dve /etc/systemd/system-sleepyö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.)