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


520

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?


3
Birisi hem WHEN hem de NEREDE gösterebilirse harika olurdu. Bunu söylüyorum çünkü diğer uygulamalara başlamadan önce başlatılacak bir senaryoyu başlatmak için en az 2 yol olduğunu biliyorum (X11 gibi)
Buttink

1
Tüm bu cevap dizisi bir karmaşa. Stack Exchange formatı bu soruya en uygun gibi görünmüyor
Gabriel Fair

1
Aslında oldukça eğlenceli. Kaç farklı yol olabilir?
devios1

Yanıtlar:


206

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 .

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 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).


58
SO ve StackExchange'in nasıl çalıştığını göz önünde bulundurarak, bir başlangıç ​​betiğine ve nereye yerleştirileceğine dair bir örnek verebilir misiniz? Bu çok daha iyi bir cevap olur. Bağlantınız sürdürülmediğini ve açılış kitabı kitabına baktığını söylüyor. Nereden başlayacağım konusunda çok fazla fikrim yok.
Ehtesh Choudhury

2
Ya komutu root olarak çalıştırmam gerekiyorsa?
dopatraman,

1
@dopatraman Cevap, bununla ilgili tüm işlemlerin kök olarak yapıldığını belirtir.
AStopher

4
Lütfen starttart yerine systemd çalıştıran sistemlerde ne yapılacağını açıklamak için bu cevabı güncelleyin (Ubuntu 15.04+).

3
Bu cevap bana mantıklı gelmiyor. Listelenen uygulamalar system->pref->startup applicationsiçinde /etc/init/veya içinde bulunamadı ~/.config/upstart. Peki , başlangıç ​​uygulamaları nerede tanımlanmaktadır?
Blauhirn

553

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

  1. Koşu crontab -e, cron'unuzu düzenlemenize izin verir.
  2. 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.


85
@rebootYaygın olarak bilinmemektedir çünkü anahtar kelime güzel bir ucu.
jathanizm

12
Güzel. Bu ne zaman tam olarak tetiklenirse fikrin var mı?
Oli

2
Yani ... eğer güç kaybedilsem ve güç geri geldiğinde bilgisayar tekrar açılsaydı bu çalışma olmaz mıydı?
Mike Will

18
@ siamii: man 5 crontabbunun @rebootbaşlangıçta çalıştırıldığını söylüyor (cron daemon başlatıldığında).
jfs

9
Bu harika. Şimdiye kadar bu 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 ..
Karthik T

161

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

sudo nano /etc/rc.local

19
Bu en doğrudan şu soruyu yanıtlar: sisteminiz önyüklendiğinde bazı komut dosyalarını nasıl çalıştıracağınız. upstart daha karmaşık bir iş yapar: Daemon işlemlerini başlatır.
Dogweather

1
Yani upstart /etc/rc.local bash betiğini başlatırken daemon daemon işlemini başlatır.
Donato

5
Olmalı mı? Bu artık bu günlerde çalışmıyor, değil mi?
DaVince

4
Doenst Ubuntu 17.04 systemd ile çalışır
qodeninja

3
Bu dosyayı kendiniz yaparsanız (yaptığım gibi), dosyayı çalıştırılabilir olarak değiştirmeniz ve ilk satıra chmod 755 rc.localeklemeniz #!/bin/bashgerekeceğini unutmayın.
psitae 16

77

15.04 ve sonrası için:

(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

Kabuk sözdizimi

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.


İşe öncelik vermek mümkün müdür? veya önce başlatılması gereken başka bir servise bağlı olduğunu
r3wt

1
@ r3wt evet, bunu yapmanın farklı yolları var. 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
Muru

@PerlDuck eksik olan tek şey değil. Teşekkürler!
muru

Rica ederim. - BT, 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.
PerlDuck

@PerlDuck 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.
muru

71

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

  1. 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.

  2. 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 .

  3. 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 ).


11
3) "Bu, .gnomerc betiğinin hemen hemen aynı amacı ve kapsamına sahiptir", ancak Unity'yi yüklemeden önce.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
Brezilyalı Adam,

1
@ ruda.almeida Buna dikkat çektiğiniz için teşekkürler. Cevap, Birlik öncesi günlerde yazıldı.
Riccardo Murri

1
sudo update-rc.d myscript.sh defaults, nerede /etc/init.d/myscript.sh betiğinizdir, başlangıçta da çalıştırılır.
Dan Dascalescu

27
$HOME/.config/autostart
  • Bu konum başlangıç ​​uygulama listesini içerir.
  • .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!



7

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 .

Ne zaman 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 .

Senaryolarını nereye koyayım

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

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`

1
Cronjobs eklemenin birçok farklı yolu vardır, ancak yüksek oyladığınız cevabın özü ve cevabınız hala @reboot.
muru

Crontabs eklemek için alternatif yöntemler açıkça Cron işleri eklemekle ilgili olan askubuntu.com/q/2368/158442 adresinde yayınlanmalıdır .
muru

1
Naçizane size katılmıyorum. Söz konusu cevabın özü, 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.
WinEunuuchs2Unix

2
Ah lütfen. İkimiz de editörün değiştirilebileceğini biliyoruz.
muru

@muru Evet, muhtemelen bana öğrettiğin için editörü nano veya birkaç CLI gibi bir şeyle değiştirmeyi öğrendim. Ama ben gedit kampındayım. Ayrıca 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.
WinEunuuchs2Unix

5

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.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.