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:
- Koşma
crontab -e
bu, cron'unuzu düzenlemenize izin verecektir. -
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ı johndoe
s ~/.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:
-
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
veman 8 init
tüm detayları anlat. -
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. 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ızsh
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.sh
Eğ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