Bir kapatma kancası yapmanın en iyi yolu?


9

Ubuntu bir süredir uptart'a bağlı olduğundan, sistem kapatma veya yeniden başlatma sırasında belirli uygulamaları zarif bir şekilde kapatmak için bir uptart işi kullanmak istiyorum. Bu uygulamalar kapatılana kadar sistemin kapatılması veya yeniden başlatılması durdurulmalıdır.

Uygulamalar zaman zaman manuel olarak başlatılacak ve sistem kapatıldığında otomatik olarak bir komut dosyasıyla (zaten sahip olduğum) sonlandırılmalıdır. Uygulamalar (neredeyse tümü) diğer hizmetler çalışmadan güvenilir bir şekilde sonlandırılamadığından, uygulamaların sona ermesi, kapatma işleminin geri kalanı başlamadan önce yapılmalıdır.

Ben bunu kapatma sırasında tetiklenecek bir uptart işi ile çözebilirim, ama hangi olayları hangi şekilde kullanmam gerektiğinden emin değilim. Şimdiye kadar aşağıdaki (kısmen çelişen) ifadeleri okudum:

  • Başlangıçta genel bir kapatma olayı yok
  • start on starting shutdownİş tanımında olduğu gibi bir stanza kullanın
  • start on runlevel [06S]İş tanımında olduğu gibi bir stanza kullanın
  • start on starting runlevel [06S]İş tanımında olduğu gibi bir stanza kullanın
  • start on stopping runlevel [!06S]İş tanımında olduğu gibi bir stanza kullanın

Bu önerilerden şu sorular ortaya çıkar:

  • Ubuntu'nun yeni başlangıcında genel bir kapatma olayı var mı ya da yok mu?
  • Bir "kapatma kancası" uygulamak için önerilen yol nedir?
  • Olaylar çalışma seviyesi [x] ne zaman tetiklenir; bu, çalışma seviyesine girerken veya çalışma seviyesine girerken mi?
  • Biz böyle bir şey kullanabilir miyim start on starting runlevel [x]veya start on stopping runlevel [x]?
  • Sorunum için en iyi çözüm ne olurdu?

Çok teşekkür ederim

Yanıtlar:


2

startingve runlevelayrı olaylardır, yani anlamlı bir şekilde söyleyemezsiniz starting runlevel N.

runlevel NOlay çalışma seviyesi giren başlangıcında yayılır. Eğer start on runlevel Nöyleyse göreviniz girişte çalışır. Çalışma seviyesine giriş tamamlandığında çalıştırmanın yolu run on started rc RUNLEVEL=N.

Anladığım kadarıyla, start on runlevel [06S]ne yapmak istediğinizi yapmanız gerekiyor ; teoride, başka bir şey durdurulmadan çalıştırılmalıdır. Daha hassas kontrol start on stopping apache or stopping mysql or ...için, görevinizin herhangi birinin kapatılmasına izin verilmeden önce çalışması için kullanabilirsiniz .


Çalışma seviyesi 5'i S olarak değiştirmek için düzenlendi.


1
Ayrıca, ayırt edici bir startupolayın tek nedeni "pompayı doldurmak" için bir şeye ihtiyaç duyulmasıdır. Bu ayrıcalıklı bir olay gönderildikten sonra, diğer her şey tarafından tetiklenen işler ve görevler tarafından tanımlanabilir ve tanımlanabilir startup. Tek bir shutdownolay olmamasına gelince , bunun shutdownanlamlı olması için pek çok farklı tür vardır . Çalışmanız gereken işlere doğrudan bağımlı olmak daha iyidir.
geekosaur

Çok teşekkür ederim. Sorularıma cevap verdiği ve sorunu çözdüğü için cevabınızı minnetle kabul ediyorum. Bununla birlikte, ek bir soru / yorumum var (bu bir sorunla ilgili değil): AFAIK, çalışma seviyesi kavramını tamamen değiştirmenin amacı budur. Küresel bir kapatma kancası almak için çalışma seviyelerine güvenmemiz gerektiği bu hedefle çelişiyor. Bence upstart böyle bir olayı tanıtmak zorunda kalacak. Gerçekten ihtiyacımız olan işlere bağımlı olmanın daha iyi olacağını açıkça anlıyorum, ancak diğer yandan, benim durumumda, bir sürü iş ... devamı ...
Binarus

(neredeyse her şey çalışıyor) ve hatta kutuda çalışan süreçler (ps -Alf) ve bu süreçleri kontrol eden işler arasındaki ilişkiyi bulmayı düşünmeye bile cesaret edemiyorum; Tabii ki 1: 1 ilişkisi yoktur. Herhangi bir işlemle ilgili olmayan işler vardır (örneğin ağın yapılandırılması) ve sanırım işlerle ilgili olmayan ve özellikle işleri manuel olarak başlatırken yeterli süreçler var.
Oli

Upstart değiştirilmiş sabit kodlu çalışma seviyeleri; belirleyebildiğim kadarıyla, çalışma seviyesi kavramı ortadan kalkmıyor, sadece kullanıcı alanında tanımlanıyor. Böyle uzun bir dönem için endişeleniyorsanız, çalışmanız on stopping servicea or stoping serviceb or ...gereken herhangi bir hizmet için çalıştığım son önerimi kullanmak istersiniz .
geekosaur

Birkaç yanlışlık için -1. Düz, bu aslında işe yaramaz. başlatıldığında dur rc RUNLEVEL = [016] farklı bir frun 'durma seviyesinde [016]' dur. Bunun nedeni, hiçbir olayın kapatmanın ilerlemesini engellememesidir. 'Run on' geçerli olmadığı için geçersiz bir sözdizimi de var. Tüm bunlar sadece sorunu karıştırıyor, aslında yardımcı olmuyor. Üzgünüm, bu çok geç! Sadece eski cevapları gözden geçiriyorum.
SpamapS

2

İşiniz dururken kapatma işleminin devam etmesini durdurmak için şunu kullanmak isteyeceksiniz:

stop on starting rc RUNLEVEL=[016]

'Kapatma' yazdığınızda gerçekleşen ilk şey tunlevel 0 olduğu için bu işe yarayacaktır. rc çalışma seviyesinde başlar ve durması -> başlangıcından geçiş, durumu da değiştirmesi gereken işler bu durumu tamamlayana kadar tamamen engellenir.

İşleminizin SIGTERM'e hızlı bir şekilde yanıt verdiğinden emin olmak istersiniz. 5 saniye içinde yanıt vermezse, uptart SIGKILL gönderir. Bunu 'öldürme zaman aşımı X' ile yükseltebilirsiniz.

Oradaki 1, btw biraz zor, başlangıçta o noktada çalışma seviyesinde [2345] başlayan bir şey içerdiğinden emin olmanız gerekir, böylece tek kullanıcı modu bakımı için aşağı inen bir kullanıcı işini tekrar başlatır. Neyse ki, bunu her zamanki önerilen başlangıç ​​yapmak için çok fazla çalışma yapıldı.

start on runlevel [2345]

Ayrıca bazı durumlarda, ağ devre dışı bırakılana kadar çalışmaya devam etmek için bir şeye ihtiyacınız vardır (dbus / ağ yöneticisi gibi). İstediğin için

stop on deconfiguring-networking

Kapanışta daha sonra yayılan ve onu kullanan işler geçişlerini tamamen tamamlayana kadar da engellenecek bir olaydır.


start on starting ... Kapatma kancalarımın bir şey üzerinde durması pek mantıklı değil mi demek istediniz? start on starting rc RUNLEVEL=[016]çok daha mantıklı olurdu. Ve belki de taskbaşka şeyler başlamadan önce tamamlanmasını sağlamak için oraya atılır.
Tejay Cardon

0

Geekosaur, yardımın için çok teşekkür ederim.

Bu arada, start on runlevel [016]yöntemi denedim , ama işe yaramadı ve sanırım nedenini anlıyorum:

İş gerçekten başlatıldı, ancak işin görevi bitene kadar kapatma işlemi engellenmedi. Şimdi olayların startingve stoppingiş tanımında diğer işleri engellemek için kullanılabilecek tek olay olduğuna eminim ve Upstart'ın el kitaplarının bize bunu anlatmaya çalıştığını düşünüyorum. Bu nedenle, çalışma düzeyi olayını kullanmak hiçbir zaman diğer işleri veya kapatma işlemini engellemeye neden olmaz; bu nedenle, benim amacım için işe yaramaz.

Bunun yerine, iki ihtimalim var:

  1. Önerilerinizden sonra, repective uygulamaların ihtiyaç duyduğu tüm işleri bulun ve hepsini komut dosyası için start etkinliğine şu şekilde ekleyin:

    start on stopping job1 or stopping job2 or ...
    

    Bu o kadar çok iş var ki, ciddi olarak iş listesini boşaltma ve normalde sistemde çalışan tüm işleri içeren işim için otomatik olarak bir başlangıç ​​stanza üretmek için sed yoluyla çalıştırmayı düşünüyorum .

    Avantajı, birisi önkoşullardan birini manuel olarak durdursa bile (bir çalışma seviyesi değişikliği / kapatma / yeniden başlatma ile durdurmanın aksine) ilgili uygulamaların kapatılması olacaktır.

  2. Sistemi yeniden başlatırken / kapatırken ilk önce durdurulacak bir iş bulun (bu işe "FirstJob" diyelim) ve bu işi aşağıdaki gibi bir stanzada kullanalım:

    start on stopping FirstJob
    

    Ana dezavantajları, böyle bir işin var olup olmadığını bilmemem ve bu işin gerçekten de repective uygulamanın gerçekten bağlı olduğu diğer tüm işlere bağlı olup olmadığını bilmememdir ("bu durumda diğer işe bağlıdır" anlamına gelir) diğer iş durmaya başlamadan önce ").

İki olasılıktan hangisinin daha iyi olduğuna emin değilim ...


Ben yapıyor olurdum sedsenin yerinde olsaydı, şu an bize senaryoyu.
geekosaur
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.