Rc.local komutunu yeniden oluşturmak yerine, sistemde rc.local komutunun doğru alternatifi nedir?


25

Systemd'de bazı yerel komut dosyalarını (veya çok yerel komutları) yürütmenin doğru yolunu bulamıyorum, zaten bu tür komut dosyaları için bir hizmet (bir sistemde bir birim) oluşturmamam gerektiğini biliyorum (veya yapmalı mıyım?) ....

Bulduğum geçici çözüm, rc.local oluşturmak ve yürütme izinlerini vermek.

printf '#!/bin/bash \n\nexit 0' >/etc/rc.local 
chmod +x /etc/rc.local

Örneğin, sizin tarafınızdan yapılandırılmış basit bir rc.local ile eski bir sunucu elde edersem, ne yaptığını ve dağıtımda yeni bir şey yükseltmenin veya yüklemenin ne kadar acı vereceğini bileceğim, çünkü rc.local dış tarafından saygı duyuldu paketler, ancak öte yandan, eğer bir sunucu kurarsam ve bir ya da iki ya da üç (ya da hatta sysvinit hizmetleri) sistem kurarsam, sadece basit bir görev yapmak için, bu bazen hayatınızı daha da zorlaştırabilir adlar bir gün dağıtım geliştirme tarafından oluşturulan ve belki de yükseltme üzerine yüklenen yeni komutların isimleriyle çakışabilir, bu da senaryolarım için sorun yaratır!

Rc.local'in nerede olduğunu soran başka bir soru görüyorum ve cevabı oluşturmak ve yürütme izinlerini vermek oldu, sanırım sorum gerçekten bir kopya değil , çünkü nerede olduğunu bilmek istemiyorum - inan bana, sadece istiyorum için kabul o ki kullanımdan kaldırıldı , ama bu tür şeyleri yapmak için doğru yol bulamıyorum, gerçekten sadece bu gibi bazı basit için bir birim oluşturmalıdır?


4
"tek kazanma hareketi oynamak değil"; alternatif olarak, ne istediğinizi bağlı olarak, bir sistem Birimi oluşturabilirsiniz. Muhtemelen şu an için rc.local kullanır ve uzaklara gittiğinde buna dikkat ederdim.
Rui F Ribeiro

Yani resmi yolun bir hizmet gibi bir birim oluşturmak olduğunu mu düşünüyorsun? Lütfen bunun nasıl yapılacağını bir cevap olarak gönderin.
Luciano Andress Martini

1
Ubuntu'yu denediğimde, masaüstümde önbelleğe alma konusunda ısrarcı bir ssh-agent olması için bir birim oluşturdum; Ayrıca /etc/rc.local'a bir işaret de oluşturabilirsiniz, ancak sistem şu anda kendiniz için yapıyor gibi görünüyor .... Şu an için rc.local olur ve durduysa, sahte olanı gösterir /etc/rc.local o zaman.
Rui F Ribeiro

Bu, bazı kitapların /etc/rc.local içine bir şey koymanız gerektiğini söylüyormuş gibi belgelerini kırması muhtemeldir ve örneğin, rc.local uygulamasının tamamen kullanımdan kaldırıldığı zaman çalıştırılabilir olarak işaretlenmesi gerektiğini söyleyerek bu dokümanları yükseltmeye çalışırsınız. belgeler bozuldu, ancak /etc/rc.local 'a işaret etmek için birim oluşturmanız gerektiğini söylerseniz, bu sistem belgelerinizle çelişkili olduğu için belgeleri bozuyor. Haklıysanız, büyük olasılıkla itiraz edilip edilmediğine karar vermediler, çünkü tüm belgelerin tekrar kırılacağına karar verdiklerinde hâlâ bir alternatifi olmadıklarından eminim.
Luciano Andress Martini

Hangi tür komut dosyasını çalıştırmanız gerekiyor? Systemd çok fazla birim tipine sahiptir. "Servis", birçok ünite tipinden yalnızca biridir . Örneğin, Montaj birimleri, otomatik sayı birimleri, zamanlayıcı birimleri, hedef birimleri. Onlardan biri probleminizi çözebilir mi?
andcoz

Yanıtlar:


17

Başka bir yerde işaret edildiği gibi, rc-local.servicealtında kullanmak için orta derecede kirli systemd.

  1. Dağıtımınızın bunu mümkün kılmayacağı teorik olarak mümkündür. (Ayrıca kaldırır aynı yapı seçeneğini devre dışı çünkü bu, örneğin yaygın olmadığını düşünüyorum poweroff/ rebootkomutları bir sürü insan kullandığını).
  2. Anlambilim tamamen açık değildir. Systemd rc-local.servicebir yolu tanımlar , ancak Debian en az bir önemli ayarı değiştiren bir açılan dosya sağlar.

rc-local.servicesık sık iyi çalışabilir. Yukarıdakiler için endişeleniyorsanız, yapmanız gereken tek şey, kendi kopyanızı oluşturmaktır! İşte sihir:

# /etc/systemd/system/my-startup.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/my-startup-script

[Install]
WantedBy=multi-user.target

Her ayrıntıyı anlamanız gerektiğini düşünmüyorum [*], ama burada bilmeniz gereken iki şey var.

  1. Bunu ile etkinleştirmeniz gerekir systemctl enable my-startup.service.

  2. Komut dosyanızın da dahil olmak üzere başka bir hizmete bağımlı network-online.targetolması durumunda, bunu beyan etmeniz gerekir. Örneğin bir ekleme [Unit]hatları ile, bölüm Wants=network-online.targetve After=network-online.target.

    "Erken önyükleme" hizmetlerine bağımlılık konusunda endişelenmenize gerek yok - özellikle önceden sipariş edilmiş servisler basic.target. Gibi hizmetler , ayarlanmadıkça my-startup.serviceotomatik olarak sipariş edilir .basic.targetDefaultDependencies=no

    Bağımlılıklarınızdan birinin "erken önyükleme" hizmeti olup olmadığından emin değilseniz, bir yaklaşım daha önce sipariş edilen hizmetleri basic.targetçalıştırarak listelemektir systemctl list-dependencies --after basic.target. (Not --after, değil --before).

Sistem öncesi öncesi için de geçerli olduğunu düşündüğüm bazı noktalar var rc.local:

  1. Komutlarınızın aynı şeyi kontrol etmeye çalışan başka bir programla çakışmadığından emin olmanız gerekir.
  2. Uzun süren programlar aka daemonlardan başlamamak en iyisidir rc.local.

[*] Type=oneshot+ Kullandım RemainAfterExit=yesçünkü çoğu tek vuruşlu komut dosyaları için daha anlamlı. Bir dizi komutu çalıştıracağınızı my-startup, tamamlandıktan sonra "aktif" olarak gösterileceğini ve bir servise başlamayacağınızı resmileştirir .


Peki, hizmetler veya pasajlar oluşturmak için bir tür "yerel" yer var, ya da her neyse - ya da bunun yerel olduğuna ve değiştirilmemesine güvenebilir miyim? kendi ödüllerimı geliştirirsem? Çünkü sistemin kökenliğini değiştirmek istemiyorum, bu yüzden bazı apt-get'leri kurduğumda, sistemimi değiştirilen bir betik ya da bunun gibi bir şey yüzünden yanmakta görmek istemiyorum. Sadece, bir kez daha cehennemin, sadece bir kez başlayacağına, korktuğum başka çılgınca şeyler yapmadan başlayacağına güvenmek istiyorum ... eğer kırılırsa, sonsuz olarak yeniden başlatmaya çalışmak gibi ...
Luciano Andress Martini

1
@LucianoAndressMartini, bir servise başlamanın doğru yolunun ne olduğunu soruyorsanız, bunun için gerçekten bireysel bir hizmet tanımlamanız gerekir. Bu bir yerel sistem .servicebirimi olabilir veya gerçekten bir LSB init betiği yazmak istiyorsanız, bunu yapabilirsiniz. Ben de birkaç eşini rc-local.serviceveya eşdeğerini koymak istemedim , muhtemelen işe yaradığını düşünüyorum, ama ayrı bir arka planını systemctl restart my-daemonbaşka herhangi bir şeyle yeniden başlatabilirseniz çok daha güzel görünüyor . Yerel servislerinizi yerleştirmeniz amaçlanmıştır /etc/systemd/system.
sourcejedi

1
@ LucianoAndressMartini, diğer herhangi bir hizmetle aynı adı kullanmaktan kaçınmanız gerekir - sysvinit'te olduğu gibi. Benzer durumlarda bazen isimlerimi local-... ile başlattım ...
sourcejedi

1
Teşekkür ederim!!! Yarım gün sonra kurtarıldı. Bu detaylar benim için kritikti: Type = oneshot, RemainAfterExit = evet, Wants = network-online.target, After = network-online.target. Sadece bir apache yapısını dağıtmak ve statik IP'yi 192.168.1.80'e ayarlamak, böylece yönlendirici oradaki trafiği yönlendirebilir. Önemsiz olmalı. Debian9'da can sıkıcı bir durum. "Apt-get apache", "systemctl start apache" veya init.d komutları dışındaki hiçbir çevrimiçi tavsiye, hiçbiri Debian9'da kaynak tarafından oluşturulan Apache için geçerli değildir.
MichaelsonBritt

1
@MichaelsonBritt Uzun zamandır devam eden programları akaType=oneshot daemons'u rc.local'dan başlatmamak en iyisidir. Ben kullandım ... resmileştirdi ... bir servet başlatmayacaksın. Bir daemon başlatmak hakkında bilgi istiyorsanız, lütfen yeni bir soru sorun.
sourcejedi

15

Unut gitsin rc.local.

CentOS 7 ve Debian 8 ve Ubuntu 15 hakkında dediğim gibi :

Systemd + Linux işletim sistemi kullanıyorsunuz. /etc/rc.localsistemde çift geriye dönük uyumluluk mekanizmasıdır, çünkü van Smoorenburg System 5 rcklonundaki kendi uyumluluk mekanizması olan bir mekanizma için geriye dönük uyumluluk mekanizmasıdır .

Kullanarak /etc/rc.localkorkunç yanlış gidebilir. İnsanlar sistemin ilk açılışta olduğu gibi rc.localaynı yerde, eskisi gibi aynı şekilde çalışmadığı için şaşırdılar . (Ya da yanlışlıkla bekleyin: Aslında, OpenBSD el kitabının belirttiği gibi eski sistemde sonuncu gelmedi .) Diğerleri rc.local, eski işlerin yapılması için bekledikleri şeylerin ortaya çıkmasından dolayı şaşırdı. Daha sonra tamamen yeni gibilerin geri udevkurallar, NetworkManagerın, systemd-logind, systemd-resolvedveya çeşitli "Kit" s.

" Neden init 0", "Arch kurulumunda" Fazla Argümanlar "ile sonuçlanıyor?Da örneklendiği gibi , bazı işletim sistemleri , jeneratör gibi geriye dönük uyumluluk özellikleri olmadan zaten sistemd sağlar . Debian hala geriye dönük uyumluluk özelliklerini korurken , Arch Linux sistemlerini kapattı . Bu yüzden Arch ve benzeri işletim sistemlerinde tamamen göz ardı edilmeyi bekliyorlar .systemd-rc-local-generator/etc/rc.local

Unut gitsin rc.local. Gidecek yol değil. Bir systemd + Linux işletim sisteminiz var. Bu nedenle, uygun bir sistem ve servis birimi yapın ve geriye doğru iki uyumluluk düzeyi olan bir noktadan başlamayın. (Ubuntu ve Fedora günü, öyle üç kez kaldırıldı, van Smoorenburg Sistemi 5 rcizledi klon rc.localsonra yapılmış olan iki kere kendisini sonradan görme tarafından ve daha sonra systemd ilk on yıl kadar önce, yerini.)

Ayrıca systemd'ye geçmenin ilk kuralını da unutmayın .

Bu sisteme özgü yeni bir fikir bile değildir. Van Smoorenburg rcve Upstart sistemlerinde yapılacak rciş, kullanmak yerine uygun bir van Smoorenburg senaryosu veya Upstart iş dosyası oluşturmaktı rc.local. FreeBSD'nin el kitabı bile bugünlerde birinin rckullanmak yerine uygun bir Mewburn betiği yarattığını belirtiyor /etc/rc.local. Mewburn rc, NetBSD 1.5 tarafından 2000 yılında tanıtıldı.

/etc/rc.localYedinci Baskı Unix zamanından ve öncesinden tarihler. 1983 yılında AT&T Unix System 3'te ( AT&T Unix System 5'te biraz farklı olarak ) /etc/inittabbir çalışma seviyesi ile yerini aldı . Hatta bu artık tarih oldu.rc/etc/inittab

Servis yönetim sisteminiz için uygun yerel servis tanımları oluşturun, bunun nosh araç seti için bir servis paketi service-managerolup system-control, /etc/rc.d/Mewburn için bir komut rcdosyası, systemd için bir servis birimi dosyası, Upstart için bir iş dosyası, runit / s6 / daemontools için bir servis dizini -encore, hatta /etc/init.d/van Smoorenburg için bir senaryo rc.

Sistemd'de, yönetici tarafından eklenen servis birimi dosyaları /etc/systemd/system/genellikle (veya /usr/local/lib/systemd/system/nadiren) girer. Nosh servis yöneticisi ile, /var/local/sv/yerel servis paketleri için geleneksel bir yer. rcFreeBSD üzerinde Mewburn kullanır /usr/local/etc/rc.d/. Paketlenmiş servis birimi dosyaları ve servis paketleri, bunları yapıyorsanız, farklı yerlere de olsa gidin.

daha fazla okuma


2
@ LucianoAndressMartini Daha iyi bir soru, bir systemd hizmetinde belirli bir rc.local snippet'inin nasıl işleneceği olacaktır. Yani aklınızda belirli bir snippet'iniz varsa (bazı yazılımların dokümantasyonundaki talimatlardan bahsediyorsunuz), belki bunun hakkında bir soru sorabilirsiniz? Dönüşüm için kullanılabilecek bazı genel kurallar vardır, ancak çalıştırmakta olduğunuz yazılımın özelliklerinden yararlanarak (örneğin ön planda çalıştırma, arka plana çıkarmaya çalışmama, vb.) Özel bir durum hakkında soru sorarak daha fazla yararlanabilirsiniz. yardımcı olabilir.
filbranden

4
1983'ten beri itirazdan kurtuldu mu diye merak etmelisin, belki bunun için bir şeyler olabilir?
dan carter

4
Bu cevap vaaz niteliğindedir ve aslında basitçe "bunun yerine ne önemsiz şey yapmalıyım" sorusuna cevap verememektedir. Bilgi içerebilir ve tonlarca referans sağlayabilir, ancak yığın değişiminin amacını ortadan kaldırır.
gps

Bunu (rc.local'ın sonu), Linux'un gelişmemesinin nedenleri olarak dns ile ilgili sorunları çözme ile birlikte ortaya koyuyorum, ancak aslında gittikçe daha fazla spagetti kodu almak, sistemd birçok kişi için kara kutu haline geldi. Bir kullanıcı veya yönetici rc.local'a bir şey koymak istiyorsa ve artık yapamıyorsa, birkaç dakika yerine, aynı son sonucu elde etmek için önce onları bir sistem sistemi veya vaaz ettiğiniz başka bir şey yapması için zorlamakta fayda yoktur. Tabii ki, salaklar iyi çalışan ve birlikte çalışması kolay olan her şeyle aptalca şeyler yapabilir, bu asla sona erdirmek için geçerli bir argüman değildir.
Julius

2

Https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd'ın özeti

/Etc/systemd/system/rc-local.service oluşturun:

# /etc/systemd/system/rc-local.service
[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
 RemainAfterExit=yes
 SysVStartPriority=99

[Install]
 WantedBy=multi-user.target

Sonra:

sudo touch /etc/rc.local
sudo chmod +x /etc/rc.local
sudo systemctl enable rc-local

Şununla kontrol et:

sudo systemctl start rc-local.service
sudo systemctl status rc-local.service

Sistem tarafından sağlanan sistem kullanır StandardOutput=journal+console(konsol, örneğinizdeki tty'ye eşdeğerdir), bu sorun giderme için çok daha faydalı olacak gibi görünüyor. Ayrıca SysVStartPriority=bir noktada destek kaldırıldı. Belki ne kadar önemli SysVStartPriority=olduğunu yorumlayabilir veya kaldırabilirsiniz. Bunun dışında, iyi bir cevap.
sourcejedi
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.