it-swarm-tr.com

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

Ubuntu başladığında scriptleri nasıl çalıştırabilirim otomatik olarak bu yüzden başlangıçtan sonra onları manuel olarak çalıştırmak zorunda kalmayacağım?

511
myusuf3

Ne tür komut dosyalarını çalıştırmanız gerektiğine bağlı olarak .. Servisler ve benzeri şeyler için pstart 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.

14.04 ve üstü için

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 .conf dosyasında /etc/init (sistem önyüklenirken root olarak çalıştırılması gerekirse) ya da ~/.config/upstart (kullanıcı ne zaman çalıştırılmaya ihtiyaç duyarsa) içine kaydedin. giriş yapın).

204
LassePoulsen

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

  1. crontab -e öğesinin çalıştırılması, kronunuzu düzenlemenizi sağlar.
  2. Buna böyle bir satır eklemek:

    @reboot /path/to/script
    

    bilgisayarınız başlatıldığında o betiği çalıştıracaktır.

546
ceejayoz

Komutu /etc/rc.local 'a eklemeye ne dersiniz? Bu dosyayı düzenlemek için Sudo erişimi kullanmanız gerekecek.

Sudo nano /etc/rc.local
159

15.04 ve sonrası için:

Çalıştırmak için (kısa ömürlü)1 systemd komutunu kullanarak başlangıçta komut, OneShot türünde bir systemd birimi kullanabilirsiniz. Örneğin, şunları içeren /etc/systemd/system/foo.service 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şi sistemli olana dönüştürüyor (bakınız pstart kullanıcıları için Systemd ).

Birden fazla ExecStart satırı kullanarak aynı hizmet 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. Yolun önündeki bir -, sisteme sıfır olmayan bir çıkış durumunu yok saymasını söyler (bir hata olarak düşünmek yerine).

İlgili:


Kullanıcı oturumları için systemd birimini ~/.config/systemd içinde 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çeneği eklendi:

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

Kabuk sözdizimi

Upstart'tan farklı olarak, systemd Exec* komutlarını bir Kabuk aracılığıyla çalıştırmaz. Bazı sınırlı değişken genişleme ve çoklu komut (; ile ayrılmış) kendisi gerçekleştirir, ancak bu, Shell benzeri sözdizimine gelince budur. Daha karmaşık bir şey için, yönlendirme veya borular söyleyin, komutunuzu sh -c '...' veya bash -c '...' içine kaydırın.


1Uzun ömürlü iblislerin aksine.

74
muru

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

  1. pstart sistemi, /etc/init dizininde bir yapılandırma bulduğu tüm betikleri çalıştırır. Bu komut dosyaları, sistemin başlatılması sırasında (veya belirli bir olaya, örneğin bir kapatma isteğine yanıt olarak) yanıt verir 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 size tam bilgileri verir .

  2. Ana dizininizdeki .gnomerc adlı bir Shell betiği, bir GNOME oturumuna her giriş yaptığınızda otomatik olarak kaynaklanı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.

    Oturumun .gnomerc betiği bitinceye kadar başlamadığını unutmayın; bu nedenle, uzun süre çalışan bazı programları otomatik olarak başlatmak istiyorsanız, çalışan Shell'den programı kaldırmak için, program çağrısına & eklemeniz gerekir.

  3. Menü seçeneği Sistem -> Tercihler -> Başlangıç ​​Uygulamaları , grafiksel oturumunuz başladığında hangi uygulamaların başlatılacağını tanımlamanıza izin verir (Ubuntu, bazılarını önceden tanımlamaktadır), ve bunları zevkinize ekleyin veya çıkarın. Bu, sh sözdizimini bilmeniz gerekmediği sürece .gnomerc betiğinin hemen hemen aynı amacı ve kapsamına sahiptir (ancak hiçbir sh programlama yapısını kullanamazsınız).

71
Riccardo Murri
$HOME/.config/autostart
  • Bu konum başlangıç ​​uygulama listesini içerir.
  • .desktop başlangıçta çalıştırılacak olan dosya buraya koyulabilir.

.desktop dosyası için örnek örnek:

Aşağıdaki .desktop dosyasını $HOME/.config/autostart içine ve chmod +x olarak belirtin:

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

Burada "</path/to/script>", script.sh yolunuzla değiştirilir
(genellikle /usr/local/bin için önerilir, böylece doğrudan ["</path/to/script>"] ile değiştirilmiş myscript komutu ile çalıştırılabilir).

script.sh örnek örneği:

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

Sonuç: .desktop dosyası, $HOME/.config/autostart tarafından komut dosyasını çalıştıran Exec= öğesinden başlatılacak

Dolayısıyla, istediğiniz Shell betiğini başlangıçta çalıştırabilirsiniz!

27
Pandya

Basit şeyler için System-> Preferences-> Sessions komut dosyanızın konumunu işaret eden bir komut ekleyebilirsiniz.

Alternatif olarak, /etc/init.d/rc.local dosyasına ekleyebilir veya eğer daha fazla ise bir starttart işi yapabilirsiniz low level .

Daha fazla bilgi için https://help.ubuntu.com/community/UbuntuBootupHowto 'a bakınız.

18
tutuca

Bunun için pstart 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 da izin verir (ör. Ağın çalışmasına mı ihtiyacınız var? Vb.)

5
txwikinger

cron cevap, en çok oylanandan farklı bir şekilde uygulandı

Bu cevap hala cron kullanır, 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 16.04'ten beri bilgisayar başlatıldığında işleri çalıştırmak için cron kullanmaya başladım.

cron ne zaman çalışır?

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 size çalışan işlerin durumunu e-postayla gönderebilir ve @reboot işleri çok erken çalışır, ağ yöneticisi ve komut dosyası içine sleep komutu koymadığınız sürece e-posta çalışmayacaktır. s).

Senaryolarını nereye koyayım

Komut dosyalarınızı /etc/cron.d dizinine yerleştirin:

$ 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

Bir komut dosyası neye benziyor?

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