Kabuk betiğini başlangıçta çalıştırma


367

Bir Amazon S3 Linux örneğinde, denilen start_my_appve sonsuza kadarstop_my_app başlayan ve durduran iki komut dosyam var (bu da Node.js uygulamamı çalıştırıyor). Bu komut dosyalarını Node.js uygulamamı el ile başlatmak ve durdurmak için kullanıyorum. Çok uzak çok iyi.

Benim sorunum: start_my_appSistem her açıldığında çalışacak şekilde ayarlamak istiyorum . İçinde bir dosya eklemeniz gerektiğini init.dbiliyorum ve içinde uygun dizine nasıl symlink biliyorum rc.d, ama aslında yerleştirdiğim dosyanın içine ne girmesi gerektiğini anlayamıyorum init.d. Sadece bir satır olması gerektiğini düşünüyorum start_my_app, ama, bu benim için işe yaramıyor.


5
Ben bu tür şeyler hiçbir experte, ama ben init.dçözüm ( burada ) rc.localçözüme tercih edilmelidir düşünüyorum, çünkü ikincisi sadece hala kullanılabilir olan yeni takım geriye çünkü yeni takım.
erikbwork

pm2 başlat my_app; pm2 başlangıcı; pm2
Unitech

Yanıtlar:


292

Girdiğiniz dosyada /etc/init.d/yürütülebilir dosyayı ayarlamanız gerekir:

chmod +x /etc/init.d/start_my_app

@Meetamit sayesinde, bu çalışmazsa, bir symlink oluşturmanız gerekir. /etc/rc.d/

ln -s /etc/init.d/start_my_app /etc/rc.d/

Lütfen en son Debian'da, komut dosyanızın LSB uyumlu olması gerektiği için çalışmayacağını unutmayın (en azından şu eylemleri sağlayın: başlat, durdur, yeniden başlat, zorla yeniden yükle ve durum): https: //wiki.debian .org / LSBInitScripts

Not olarak, komut dosyanızın göreli yerine mutlak yolunu koymalısınız, beklenmedik sorunları çözebilir:

/var/myscripts/start_my_app

Ve bu dosyanın üstüne eklemeyi unutmayın:

#!/bin/sh

6
bunu yaptım ve çalışmadı. /etc/init.d içinde olduğu için otomatik olarak çalışacak mı yoksa sistem başladığında çalışacak şekilde zamanlamak için üstte bir şey yapmam gerekiyor mu?
ampütan

4
@amphibient Yeterince yeterli değil ... Ayrıca bu dosyaya ( lnkomut kullanarak ) içindeki bir dizine bir sembolik bağlantı oluşturmanız gerekirrc.d
meetamit

23
benim kök vb klasöründe hiçbir rc.d dizini .. bu beni şaşkın var Bu Linux başlatmak için önemli bir dizin değil mi? Sadece bir işletim sistemi iyi çalışıyor gibi görünüyor. Onu oluşturmak zorunda mıyım? Ben "rc5.d" sonuna kadar "rc1.d" gibi benzer adlandırılmış dosyaları bir sürü görüyorum
OKGimmeMoney

3
Hiç yapmadıysanız /etc/rc.dklasörü ama var /etc/rcX.d(Yani klasörleri /etc/rc0.d , /etc/rc1.d , /etc/rcS.d ), ayrıca bir dosya var /etc/rc.local . /etc/rc9.dMevcut klasörlerden biri gibi veya birinde özel klasörde
semboller

2
Bu soru bana bu konuda yardımcı oldu: unix.stackexchange.com/questions/28679/…
seth10

344

Bunun için bir crontab ayarlayın

#crontab -e
@reboot  /home/user/test.sh

her başlangıçtan sonra test komut dosyasını çalıştırır.


4
Bu benim için sorunsuz çalışan tek çözüm! teşekkür ederim
whoopididoo

20
Bu en iyi çözüm, @reboot sh $HOME/test.shcrontab'da daha da temiz
user3667089

4
@ user3667089 aslında çalışmıyor. Terminali açıyorum, "crontab -e" yazıyorum, "@reboot sh /home/user/test.sh" yazdığım bir pencere görünüyor ama başlangıçta çalışmıyor. Nerede yanlış yapıyorum?
MycrofD

1
@ user3667089 her zamanki varsayılan satırlar '# Bu dosyayı şuraya düzenle ...' ve ardından '@reboot sh /home/.../.sh' yazdığım satır. Ben de '@reboot /home/.../.sh' ilk "sh" olmadan ama hiçbir sonuç denedim.
MycrofD

3
@MycrofD , gerçekten ayarlandığını onaylamak için crontab -lgöstermelisiniz @reboot sh $HOME/test.sh.
user3667089

124

Basit bir yaklaşım şuraya bir satır eklemektir /etc/rc.local:

/PATH/TO/MY_APP &

veya komutu özel bir kullanıcı olarak çalıştırmak istiyorsanız:

su - USER_FOOBAR -c /PATH/TO/MY_APP &

(sondaki ve arka planı işler ve rc.local uygulamasının yürütülmesine izin verir)

Tam bir başlangıç ​​komut dosyası istiyorsanız, debian distro'nun bir şablon dosyası vardır, bu nedenle:

cp /etc/init.d/skeleton /etc/init.d/your_app

ve biraz uyarlayın.


2
Teşekkürler! Bu yaklaşım, basit gereksinimler göz önüne alındığında en iyi sonucu verdi. Kullanıcıyı belirtmem gerektiğinden eminim, aksi takdirde uygulamayı manuel olarak durdurmaya ihtiyaç duyduğunuzda ( stop_my_appçalışarak) bunu yapmak zorundayım sudo, hayır? Ayrıca, sondaki ve işareti (?) İşlevinin tam olarak ne olduğunu merak ediyorum.
meetamit

3
Kullanıcı uygulamanıza bağlıdır. Ancak kök olarak çalıştırmak için kesinlikle gerekli değilse, bundan kaçının. &arka planda işlemi yürütmek
Gilles Quenot

2
Sputnick, üzgünüm, ama Koren'i kabul edilen cevap olarak işaretlemeliyim, esas olarak @ erikb85'in işaret ettiği şeyden dolayı, ama aynı zamanda orijinal sorum bir init.dşeyler yapma yolunu istediğinden (cevabınız benim için sadece daha basit bir çözümdü ) . Bu gönderi çok sayıda görüş ve oy alıyor, bu yüzden doğru tutmak önemlidir.
meetamit

4
Sondaki ve işareti sürecin arkaplanından ve rc.local'ın yürütülmeye devam etmesine izin verdiği belirtilmelidir.
mchicago

Bunun için teşekkürler! Son birkaç saatimi hizmet vermeye çalışırken kafamı duvara çarptırarak harcadım, ama hiçbir şey işe yaramadı. Bunu denedim, bir cazibe gibi çalışıyor!
Marko Grešak

35

Red Hat Linux sistemlerinde bunu yapıyorum .

Komut dosyanızı /etc/init.dkök ve yürütülebilir dosyalara ekleyin . Senaryonun üst kısmında bir yönerge verebilirsiniz chkconfig. Örnek olarak, aşağıdaki komut dosyası bir Java uygulamasını user oracle olarak başlatmak için kullanılır.

Komut dosyasının adı: /etc/init.d/apex

#!/bin/bash
# chkconfig: 345 99 10
# Description: auto start apex listener
#
case "$1" in
 'start')
   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
 'stop')
   echo "put something to shutdown or kill the process here";;
esac

Bu, komut dosyasının 3, 4 ve 5. düzeylerde çalışması gerektiğini ve başlatma / durdurma önceliğinin 99 ve 10 olduğunu söylüyor.

Ardından, kullanıcı olarak komut dosyasını başlangıçta etkinleştirmek veya devre dışı bırakmak için rootkullanabilirsiniz chkconfig:

chkconfig --list apex
chkconfig --add apex

Ve kullanabilirsiniz service start/stop apex.


Bu arada epel deposunda bulunan supervisord ( supervisord.org ) adlı bir paketi denedim. Programları başlatmak ve izlemek, arıza durumunda yeniden başlatmak için kullanılabilir.
Saule

"Chkconfig --add service_name" yazmak yerine, /etc/init.d/ klasörüne komut dosyası koyduktan sonra şunu yazabilirsiniz: "chkconfig service_name on"
Dragan Radevic

22

Şunu cronkullanarak girin sudo:

sudo crontab -e

Başlangıçta çalıştırılacak bir komut, bu durumda bir komut dosyası ekleyin:

@reboot sh /home/user/test.sh

Kayıt etmek:

Kaydetmek ve çıkmak için ESC ve ardından: x tuşlarına basın veya ESC ve ardından ZZ tuşlarına basın (shift + zz)

Test Test Testi :

  1. Gerçekten çalıştığından emin olmak için test komut dosyanızı cron olmadan çalıştırın.

  2. Komutunuzu cron'a kaydettiğinizden emin olun, sudo crontab -e

  3. Tümünün çalıştığını onaylamak için sunucuyu yeniden başlatın sudo @reboot


Bunu çok beğendim. Teşekkürler! Ps. kullanmayan sudogeçerli kullanıcı kullanarak başlatma sırasında belli bir komutu çalıştırmak istiyorsanız.
danger89

Bu bilgilerin nerede saklanması gerekiyor? İçinde değil /tmp??
Peter Mortensen

15

Sadece crontab'ınıza bir satır ekleyin ..

Dosyanın yürütülebilir olduğundan emin olun:

chmod +x /path_to_you_file/your_file

Crontab dosyasını düzenlemek için:

crontab -e

Eklemeniz gereken satır:

@reboot  /path_to_you_file/your_file

Bu kadar basit!


Bu benim için işe yaramıyor, eksik olduğum bir şey var mı? # uname -a Linux accton-xp70a0-26-a1 3.11.10-301.fc20.x86_64 #1 SMP Thu Dec 5 14:01:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

Bu CentOs 7 benim için çalıştı. Sorunları olanlar için, ben bir kabuk komut dosyası oluşturmak, yürütülebilir (chmod + x dosya_adı) yapmak ve sırayla düğüm path_to_file / index.js çağıran kabuk komut dosyasını çağırmak gerekiyordu
SeanOlson

11

Başka bir seçenek, crontab'ınızda @reboot komutuna sahip olmaktır.

Her cron sürümü bunu desteklemez, ancak örneğiniz Amazon Linux AMI'ye dayanıyorsa çalışır.


6

Bunu yapabilirsin :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

o zaman bu komutu kullan

update-rc.d start_my_app defaults 100

Lütfen Cyberciti'deki bu sayfaya bakınız .


1
Yocto üzerine kurulmuş güzel bir barebone kurulumum var ve bu benim script thingie çalışmasını sağlamak için tek yol oldu. Teşekkürler.
Catalin Vasile

3

Kendi / init yürütülebilir dosyalarınızı oluşturun

İstediğiniz bu değil, ama eğlenceli!

Sadece rastgele çalıştırılabilir bir dosya, hatta bir kabuk komut dosyası seçin ve çekirdeği komut satırı parametresiyle önyükleyin:

init=/path/to/myinit

Önyüklemenin sonuna doğru, Linux çekirdeği belirtilen yolda çalıştırılabilir ilk kullanıcı alanını çalıştırır.

Birçok proje init, sistemd gibi büyük dağıtımların kullandığı popüler yürütülebilir dosyaları sağlar ve çoğu dağıtımda, normal sistem işletiminde kullanılan bir grup işlemi çatallar.

Ama kaçırma yapabiliriz /init sistemimizi daha iyi anlamak için kendi minimal komut dosyalarımızı çalıştırmak için bunu .

İşte minimal bir tekrarlanabilir kurulum: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init


2

Bu basit çözüm benim için CentOS çalıştıran bir Amazon Linux örneğinde çalıştı. Düzenleyin /etc/rc.d/rc.localdosya ve orada komutu koydu. Bu dosyada diğer tüm init komut dosyalarından sonra yürütüleceği belirtilmektedir . Bu konuda dikkatli olun. Dosya şu anda beni böyle görüyor. resim açıklamasını buraya girin. Son satır betiğimin adıdır.


1

Çalıştırmak istediğiniz tek şey basit bir komut dosyasıysa (veya herhangi bir şey) mutlak en kolay yöntem, sistem> tercihleri ​​kullanmak için bir GUI'niz varsa uygulamaları başlatın.

İstediğiniz komut dosyasına göz atın ve işte gidin. (komut dosyasını yürütülebilir yap)


3
Bu aslında başlangıçta değil, girişte oldukça büyük bir fark. Ayrıca her sistemde (özellikle sunucularda) "Sistem> Tercihleri" olmayacağından belirli bir kuruluma da bağlıdır.
jazzpi

'linux başlangıçta yürüt' arama terimi beni aradığım bu cevaba götürdü. OP tarafından soruyu cevaplamasa da, bu benim gibi linux (ubuntu) noobs'a yardımcı olabilir, bu yüzden bir oylamayı hak ediyor. Ben de sevmiyorum, ama bu pragmatizm.
thymaro


1

Lubuntu'da bunun tersini yapmak zorunda kaldım. Skype önyüklemeden sonra çalışmaya başlar ~/.config/autostart/ve dosyada buldum skypeforlinux.desktop. Dosyanın içeriği aşağıdaki gibidir:

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

Bu dosyayı silmek bana yardımcı oldu.


0
  • Komut dosyanızı /etc/init.d/ dizinine ekleyin
  • RC çalışma seviyenizi güncelleyin: $ update-rc.d myScript.sh defaults NNburada NN, yürütülmesi gereken sıradır. Örneğin 99, 98'den sonra ve 100'den önce çalıştırılacağı anlamına gelir.

0

Python 3 mikro hizmetleri veya kabuğu ile çalışma; kullanarak Ubuntu Sunucu 18.04 (Biyonik Beaver) veya Ubuntu 19.10 (Eoan Ermine) veya Ubuntu 18.10 (Kozmik Mürekkepbalığı) Ben hep bu adımlar gibi yapın ve işe yaradı hep çok:

  1. Benim durumumda p example "brain_microservice1.service" adlı bir mikro hizmet oluşturmak:

    $ nano /lib/systemd/system/brain_microservice1.service
  2. İçinde bulunduğunuz bu yeni hizmetin içinde:

    [Unit]
    Description=brain_microservice_1
    After=multi-user.target
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices    /microservice_1.py -k start -DFOREGROUND
    ExecStop=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful-stop
    ExecReload=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful
    PrivateTmp=true
    LimitNOFILE=infinity
    KillMode=mixed
    Restart=on-failure
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
  3. İzinleri verin:

    $ chmod -X /lib/systemd/system/brain_microservice*
    $ chmod -R 775 /lib/systemd/system/brain_microservice*
  4. Yürütme iznini verin ve ardından:

    $ systemctl daemon-reload
  5. O zaman etkinleştir, bu her zaman başlangıçta başlayacaktır

    $ systemctl enable brain_microservice1.service
  6. Sonra test edebilirsiniz;

    $ sudo şimdi yeniden başlat

  7. Bitiş = BAŞARI !!

Bu kabuk çalıştırmak için aynı vücut komut dosyası ile yapılabilir, tepki ... veritabanı başlangıç ​​komut dosyası ... her türlü os kodu ... umarım bu yardım u ...

...



0

İşte daha basit bir yöntem!

İlk olarak, bir kabuk betiği yazın ve bir .sh kaydedin burada bir örnek

#!/bin/bash
Icoff='/home/akbar/keyboardONOFF/icon/Dt6hQ.png'
id=13
fconfig=".keyboard"
echo "disabled" > $fconfig
xinput float $id
notify-send -i $Icoff "Internal Keyboard disabled";

bu komut dosyası başlangıçta dahili klavyeyi devre dışı bırakır.

İkinci olarak: "Başlangıç ​​Uygulama Tercihleri" uygulamasını açın

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Üçüncü olarak: Ekle'yi tıklayın. dördüncü: İSİM bölümünde bir isim verin. beşinci: Komut bölümünde .sh dosyasına göz atın. altıncı: komut bölümünüzü şu şekilde düzenleyin:

bash <space> path/to/file/<filename>.sh <space> --start

yedinci: Ekle'yi tıklayın. Bu kadar! Tamamlandı!

Şimdi bilgisayarınızı yeniden başlatarak onaylayın.

şerefe!


-1

Ağrısız, en kolay ve en evrensel yöntem basitçe ~.bash_profileveya ile yürütmektir ~.profile (bash_profile dosyanız yoksa) .

Bu dosyanın altına yürütme komutunu eklemeniz yeterlidir ve sistem başlatıldığında çalıştırılır.

Altta bir örnek var; ~\Desktop\sound_fixer.sh


2
Bu yanlış. ~/.bash_profilekullanıcı oturum açtığında çalışır - sistem açıldığında değil . Orijinal soruda amaç, makinenin başlatılması üzerine Node.js uygulama sunucusunu çalıştırmaktır. Çözümünüz, bir insan kullanıcının Node.js sunucusu çalışmadan önce makinede oturum açmasını gerektirir. Ve, bir tür sorun bir gecede sunucunun yeniden başlatılmasına neden oluyorsa, uygulama tekrar oturum açana kadar hayata geri dönmeyecektir.
16'da meetamit

-6

Bazı insanlar için bu işe yarayacaktır:

SistemTercihlerBaşlangıç ​​Uygulamaları'na aşağıdaki komutu ekleyebilirsiniz :

bash /full/path/to/your/script.sh

Bunu sistem tercihleri ​​menüsünde görmüyorum. Ancak uygulama başlatıcısında arama yaptığımda bunu görüyorum.
OKGimmeMoney

Bu aslında başlangıçta değil, girişte oldukça büyük bir fark. Ayrıca her sistemde (özellikle sunucularda) "Sistem> Tercihleri" olmayacağından belirli bir kuruluma da bağlıdır.
jazzpi

3
Bu cevap Ubuntu / Linux masaüstü için daha fazla görünüyor, ancak kullanıcı aslında bildiğim kadarıyla GUI'sı olmayan bir AWS EC2 Linux örneği için yardım istiyor.
Vini.g.fer
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.