Bir uygulama önyükleme sırasında otomatik olarak nasıl başlatılır


27

Linux'ta yeniyim ve uygulamayı başlatmak için sabırsızlanıyorum (bu, her 10 saniyede bir geçiş yapar). Uygulama programını yazdım ve iyi çalışıyor ancak şimdi açılışta otomatik olarak başlatmak istiyorum.

Dokümantasyon burada için başlangıç komut kopyalamak diyor /etc/init.dkopyalanan komut sembolik bir bağlantı dizin ve yapmak rc.ddizine.

Bu script dosyalarının uzantısı ve adı ne olmalıdır? Sembolik bağlantıyı manuel olarak ekleyebilir miyiz rc.dveya bunun için belirli bir prosedür var mı?

Herhangi bir öneri nasıl elde edilir?


Başlangıç ​​için bir init betiği eklemek için tercih edilen yöntem dağıtımlara göre değişir. Hatta bazıları, başlangıç ​​ve sistem lehine onları aşamalı hale getiriyor. Debian'ın start-stop-daemondaha iyi kullandığı gibi (programın kendisi cansızlaştırmakla birlikte) arka plana basitçe "&" kullanmayı önermem. Hangi dağıtımı kullanıyorsun? Masaüstü MIME türleri dışında, dosya uzantıları * nix'te anlamsızdır ve çalıştırılabilir dosyalarının bulunmamasını tercih eder.
Ürdün

Eğer petalogix kullanıyorsanız, sadece bu dökümanları takip edin - özel isimlere gerek yok, sadece söylediklerini yapın. Onu denedin mi? Ne sorunlar yaşıyorsunuz? (Değilse, lütfen dağıtımınızı belirtin ve denediklerinizle neyin işe yaramadığını açıklayın.)
Mat

RPI için Debian “wheezy” kullanıyorum.
gorge

1
bunu yapmak gerekirse yaklaşık her 10 saniyede (keskin yani değil 10 saniye), kullanmak isteyebilirsiniz cronyerine.
Peterph

@peterph: ancak program her 10 saniyede bir program değil, her 10 saniyede bir LED'i değiştiriyor gibi geliyor.
Zorawar

Yanıtlar:


19

İşte sorunuzu cevaplayacak gibi görünen http://www.debian-administration.org/articles/28 ' den alıntı .

Not: Aşağıdaki örnek komut dosyasında start), gerçekten programınızı başlatmak için " " bölümüne bir çağrı ekleyin . Komut dizisinin işlevselliğini sistemi yeniden başlatmadan test edebilirsiniz: tam yol ile çağırın ve " start" veya " stop" parametresini verin

İşte gidiyor:

Debian, sistem çalışma seviyesi değiştiğinde komutları çalıştırmak için Sys-V benzeri bir init sistemi kullanır;

Makine önyüklendiğinde başlatmak için yeni bir servis eklemek isterseniz, gerekli betiği dizine eklemelisiniz /etc/init.d/. Bu dizinde zaten mevcut olan komut dosyalarının çoğu size yapabileceğiniz şeylerin bir örneğini verecektir.

İşte iki bölüme ayrılmış çok basit bir script, her zaman çalışan kod ve "start" veya "stop" ile çağrıldığında çalışan kod.

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    echo "Could do more here"
    ;;
  stop)
    echo "Stopping script blah"
    echo "Could do more here"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

Dosyanızı doğru yere kaydettikten sonra, " chmod 755 /etc/init.d/blah" çalıştırılarak çalıştırılabilir olduğundan emin olun .

Ardından, komut dosyası sistem düştüğünde veya ortaya çıktığında yürütülmesini sağlamak için uygun sembolik bağlantıları eklemeniz gerekir.

Bunu yapmanın en basit yolu, Debian'a özgü komutu kullanmaktır update-rc.d:

root@skx:~# update-rc.d blah defaults
 Adding system startup for /etc/init.d/blah ...
   /etc/rc0.d/K20blah -> ../init.d/blah
   /etc/rc1.d/K20blah -> ../init.d/blah
   /etc/rc6.d/K20blah -> ../init.d/blah
   /etc/rc2.d/S20blah -> ../init.d/blah
   /etc/rc3.d/S20blah -> ../init.d/blah
   /etc/rc4.d/S20blah -> ../init.d/blah
   /etc/rc5.d/S20blah -> ../init.d/blah

aslında bu betiği etc / init.d / dizinine koymak zorunda mıyım? veya # /etc/init.d/blah üstündeki satır kabuğun yerini gösteriyor mu?
user137717,

Ben alıyorum "-sh: update-rc.d: komut bulunamadı"
m4l490n

2
Daha yeni sistemler systemd, önyükleme yapılandırması dahil olmak üzere birçok şey için çalışır. systemctlKontrol etmek ve yapılandırmak için kullanın systemd.
Alexander Shcheblikin,

4

En iyi yol, dağıtımınızın paket kaynağını düzenli bir sistem hizmeti için, örneğin OpenSSH için kontrol etmektir - iyi uygulamaların ne olduğunu göreceksiniz. Sonuçta, açık kaynaklı arkasındaki nedenlerden biri kaynaklardan öğrenebilmek.


2
Mükemmel tavsiye! Gerçekten akıllı ve alakalı ve tüm Distolara göre ayarlanmış. (Ve tesadüfen "Linux’taki yeni" ve "bunu nasıl yaparım" sorusunun bir parçası olarak yanıtlar. Bu yanıtı başlangıç ​​durdurma komut
dosyamı

3

Başlangıç ​​uygulamalarını argümanlarla yöneten ve kaydeden etkili bir program olan Supervisor'ı kullanın. Http://supervisord.org/running.html adresinden daha fazla bilgi edinin ve (Kurulum talimatlarını izleyin).

Bir conf dosyası oluşturun /etc/supervisor/conf.d/{PROGRAM_NAME}.confve İşte kod

[program:{PROGRAM_NAME}]
command=/usr/bin/{PROGRAM_NAME} -arg1 -arg2
autostart=true  
autorestart=true  
stderr_logfile=/var/log/supervisor/{PROGRAM_NAME}.err.log  
stdout_logfile=/var/log/supervisor/{PROGRAM_NAME}.out.log  

Sonra cmd satırından yürütün:

supervisorctl reload


Cevabınız gayet Oysa, bunu "supervisorctl reload" göstermeye değiştirmek gerektiğini düşünüyorum .conf dosyasında eklenecek değil, CLI'den yürütülecek olan
dlewin

3

Kullanımı crontabçok daha kolaydır.

crontab -eKullanıcının crontab'ını düzenlemek için kullanın .
Sonuna aşağıdaki satırı ekle:

@reboot <command>

Örnekler:

  • @reboot my_script.sh
  • @reboot python my_script.py arg1 arg2

Son olarak crontab -lkomut dosyanızın listeye eklendiğinden emin olmak için kullanın .


Acaba bu cevap neden aşağı oy aldı? Çok basit bir çözüm gibi görünüyor ve crontab kullanan - muhtemelen herkes zaten biliyor ve anlıyor.
kolinko

1

Linux desteğinin daha yeni sürümleri systemd(@AlexanderShcheblikin’in söylediği gibi). Daha fazla özelliğe sahip ve debian'a özgü bir çözümden daha taşınabilir.

Lütfen bu gerçekten harika kılavuzu okuyun .

İhtiyacınız olan minimum minimumun hızlı bir referansı :

  1. myscript.shYürütülebilir izinlere sahip bir komut dosyası (örn. ).
  2. Komut dosyası yürütme komutunu içeren 644 izinli myservice.service".service" uzantılı bir Birim dosyası (örn. ) /etc/systemd/system. Örneğin,

:

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /path/to/myscript.sh

[Install]
WantedBy=multi-user.target
  1. sudo systemctl enable myserviceÖnyüklemeye başlamasını etkinleştirmek için komutu çalıştırın .
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.