Başlangıçta komut dosyaları nasıl çalıştırılır?

Komut dosyalarını nasıl çalıştırabilirim otomatik olarak Ubuntu başladığında, başlattıktan sonra bunları manuel olarak çalıştırmam gerekmiyor mu?

Bir yaklaşım, bir @reboot eklemektir cron görev:

  1. Koşma crontab -e bu, cron'unuzu düzenlemenize izin verecektir.
  2. Buna böyle bir satır ekleme:

    @reboot /path/to/script

    bilgisayarınız açıldıktan sonra bu komut dosyasını çalıştırır.

Ne tür komut dosyalarını çalıştırmanız gerektiğine bağlı olarak.. Kullanmanız gereken hizmetler ve benzerleri için sonradan görme. Ancak bir kullanıcı betiği için bunlar gnome tarafından oturum betikleri olarak başlatılmalıdır! Sistem altında bir göz atın > Tercihler > Başlangıç Uygulamaları.

Bir yan notta, terminal girişinde çalıştırılacak bazı komut dosyalarına ihtiyacınız varsa, bunları .bash_loginname ev dizininizdeki dosya.

14.04 ve üstü için

(Bir çalışan olarak kalmaya ihtiyacı yok ki) basit bir komut gibi Sonradan görme bir iş kullanabilirsiniz :

start on startuptaskexec /path/to/command

Bir bu Kaydet .conf dosyala /etc/init (sistem önyüklendiğinde root olarak çalıştırmanız gerekiyorsa) veya ~/.config/upstart (oturum açtığınızda kullanıcı olarak çalıştırmanız gerekiyorsa).

Komut ekleyebilirsiniz /etc/rc.local:

sudo nano /etc/rc.local

Bu, komutları root olarak yürütür.

Komutları belirli bir kullanıcı olarak yürütmek için sudo -i -u (-i oturum açma kabuğunu da çalıştırmak için). Örneğin, kalıcı bir SSH tüneli oluşturmak için myhost içinde definde var mı johndoes ~/.ssh/config dosya:

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

Eğer dikkat edin /etc/rc.local mevcut değildi (16.04'ten beri Ubuntu'da olduğu gibi), bir shebang hattı üst (örneğin at #!/bin/bash) ve dosyanın çalıştırılabilir olduğundan emin olun:

sudo chmod a+x /etc/rc.local

15.04 ve sonrası için:

Çalıştırmak için (kısa ömürlü)1 başlangıçta komut kullanma systemd, bir systemd birimi türü kullanabilirsiniz OneShot. Örneğin, oluştur /etc/systemd/system/foo.service içerme:

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

Sonra koş:

sudo systemctl daemon-reloadsudo systemctl enable foo.service

Esasen, bu sadece dönüştürüyor tipik bir Başlangıç işi bir systemd'ye (bkz. Yeni başlayan kullanıcılar için Systemd).

Aynı hizmet dosyasından birden çok komut kullanarak birden çok komut çalıştırabilirsiniz ExecStart satırlar:

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

Komut her zaman tam yol ile verilmelidir. Herhangi bir komut başarısız olursa, geri kalanı çalıştırılmaz. A - yol, systemd'ye sıfır olmayan bir çıkış durumunu yoksaymasını söylemeden önce (bunu bir hata olarak değerlendirmek yerine).

Konu ile ilgili:


Kullanıcı oturumları için systemd birimini şu adreste oluşturabilirsiniz: ~/.config/systemd yerine. Bu, 16.04'ten itibaren çalışmalı, ancak Ubuntu'nun systemd ile önceki sürümlerinde çalışmamalıdır (çünkü bunlar hala kullanıcı oturumları için Başlangıç olarak kullanıldığından). Kullanıcı oturum birimleri, sistem hizmetleri ile aynı komutlarla kontrol edilebilir, ancak --user seçenek eklendi:

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

Kabuk sözdizimi

Upstart'ın aksine, systemd'nin çalışmadığını unutmayın Exec* bir kabuk üzerinden komutlar. Bazı sınırlı değişken genişletme ve çoklu komut gerçekleştirir (aşağıdakilerle ayrılır ;) kendisi, ancak kabuk benzeri sözdizimine gelince bununla ilgili. Daha karmaşık bir şey için, yönlendirme veya borular deyin, komutunuzu içeri sarın sh -c '...' veya bash -c '...'.


1Uzun ömürlü iblislerin aksine.

Komutları otomatik olarak çalıştırmanın farklı yolları vardır:

  1. Bu sonradan görme sistem, dizinde bir yapılandırma bulduğu tüm komut dosyalarını çalıştıracaktır /etc/init. Bu komut dosyaları sistem başlatma sırasında (veya kapatma isteği gibi belirli olaylara yanıt olarak) çalışır ve bu nedenle kullanıcıyla etkileşime girmeyen komutların çalıştırılacağı yerdir; tüm sunucular bu mekanizma kullanılarak başlatılır.

    Okunabilir bir giriş bulabilirsiniz: http://upstart.ubuntu.com/getting-started.html adam sayfaları man 5 init ve man 8 init tüm detayları anlat.

  2. Adında bir kabuk betiği .gnomerc bir GNOME oturumuna her giriş yaptığınızda giriş dizininiz otomatik olarak kaynaklanır. Oraya rasgele komutlar 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.

    Oturumun başlatılıncaya kadar başlatılmadığını unutmayın. .gnomerc komut dosyası tamamlandı; bu nedenle, uzun süredir çalışan bir programı otomatik başlatmak istiyorsanız, eklemeniz gerekir & çalışan kabuktan ayırmak için program çağrısına.

  3. Menü seçeneği Sistem -> Tercihler -> Başlangıç Uygulamaları grafik oturumunuz başladığında hangi uygulamaların başlatılması gerektiğini tanımlamanıza izin verir (Ubuntu bazılarını önceden tanımlar) ve bunları zevkinize göre ekler veya kaldırır. Bunun hemen hemen aynı amacı ve kapsamı vardır. .gnomerc senaryo, bilmene gerek yok. sh sözdizimi (ancak hiçbirini kullanamazsınız sh programlama yapısı).

$HOME/.config/autostart başlangıç uygulama listesini içerir. .desktop bu klasördeki dosyalar başlangıçta çalıştırılır. Yürütülebilir izin gerekebilir (chmod +x startup.desktop).

Örnek örnek .desktop dosya:

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

Burada "</path/to/script>" yol ile değiştirilir script.shEğer senaryonuzu yerleştirirseniz myscript içinde /usr/local/bin doğrudan komutla çalıştırılabilmesi için şunları yazabilirsiniz myscript yerine "</path/to/script>".

Örnek örnek myscript.sh:

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

Sonuç:.desktop dosya şu adresten başlatılacak $HOME/.config/autostart hangi komut dosyasını çalıştırır Exec=

Basit şeyler için bir komut ekleyebilirsiniz >>Sistem-Tercihler-Oturumlar komut dosyanızın yerini işaret ediyor.

Alternatif olarak /etc/init dosyasına ekleyebilirsiniz.d/ rc.yerel veya bir sonradan görme daha fazlası ise iş düşük seviye iş.

Şuna bir bak https://help.ubuntu.com/community/UbuntuBootupHowto daha fazla bilgi için

cron cevap, en çok oylananlardan farklı olarak uygulandı

Bu cevap hala kullanıyor cron ancak en çok oylanan cevaptan farklı bir yöntem kullanıyor. Bu Ubuntu 16.04'ten beri çalışıyor ancak muhtemelen çok daha erken desteklendi. Sadece kullanmaya başladım. cron 16.04'ten beri bilgisayar önyüklendiğinde işleri çalıştırmak için.

Ne zaman yapar cron çalıştırmak?

Yorumlarda birisi "ne zaman koşuyorlar?". Syslog / journalctl'de söyleyebilirsiniz:

$ 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

Dikkat edilmesi gereken bir şey var cron sen koşmak iş durumu e-posta ve @reboot işler bu kadar erken çalışır ağ yöneticisi ve e-posta, siz koymadığınız sürece çalışmaz sleep komut dosyanıza komut verin.

Komut dosyalarınızı nereye koyacağınız

Komut dosyalarınızı dizine yerleştirin /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

Senaryo neye benziyor?

İşte her önyüklemeyi çalıştırmak için kurduğum birkaç komut dosyası:

$ 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`

Kullanmalısın sonradan görme bunun için. Upstart, otomatik olarak başlatılan Ubuntu işlemleri için kullanılır. Eski System-V init gibi gelişmiş bir çözümdür.d senaryoları. Ayrıca, komut dosyanızın başlatılması için önkoşullar koymanıza da olanak tanır (yani ağın çalışmasına mı ihtiyacınız var? vb.)

Betiğinizin çekirdek başladıktan hemen sonra systemd'den önce çalışmasını istiyorsanız, AFAIK yolu ekliyor init=/path/to/script çekirdek komut satırına /boot/grub/grub.cfg veya daha fazla gelecek kanıtı kendi menü girişinizi yapın /etc/grub.d/40_custom bir menü girdisini kopyalayarak /boot/grub/grub.cfg ve gerekli değişiklikleri yapmak (ve koşmak update-grub bundan sonra için grub özel dosyanızı eklemek için /boot/grub/grub.cfg).

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

geçmek

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

Doğru örneğin koymak için #!/bin/bash ilk satırda ve exec /sbin/init (eğer /sbin/init sisteminizde var - benimkinde systemd'ye işaret ediyor) sonunda çekirdek paniğini önlemek için.

Birisi hem ne zaman hem de NEREDE harika olacağını gösterebilseydi. Bunu söylüyorum çünkü diğer uygulamalar başlatılmadan önce (X11 gibi) tetiklenecek bir komut dosyasını başlatmanın en az 2 yolu olduğunu biliyorum.

@Gabrielfair’e +1. Sorunun büyük bir kısmı, asıl soru ve cevabın ON yaşında olmasıdır. Ayrıca, bu sorunu çözmenin çok fazla yolu olduğunu da eklerdim. Unix felsefesinin sadeliğine ne oldu?! * Bilgili * ve yeterli puanı olan birinden bu gönderiyi yeniden yazmasını isteyin veya modern işletim sistemi sürümleri için yeni, güncel ve kesin bir yanıt ekleyin.

Tüm bu cevap konusu tam bir karmaşa. Yığın Değişim biçimi bu soru için en uygun görünmüyor