Bash yerleşik exec için vaka / pratik örnek kullanın


13

Bunu Bash yerleşik exec belgelerinden düşünün:

exec, yeni bir işlem oluşturmadan kabuğun yerini alır

Lütfen bir kullanım örneği / pratik örnek verin. Bunun nasıl bir anlam ifade ettiğini anlamıyorum.

Google'a gittim ve G / Ç yönlendirmesini buldum . Daha iyi açıklayabilir misin?


Yanıtlar:


19

execgenellikle diğer ikili dosyaları başlatmak için sarıcı görevi gören kabuk komut dosyalarında kullanılır. Örneğin:

#!/bin/sh

if stuff;
    EXTRA_OPTIONS="-x -y -z"
else
    EXTRA_OPTIONS="-a foo"
fi

exec /usr/local/bin/the.real.binary $EXTRA_OPTIONS "$@"

böylece sarmalayıcı çalışmayı bitirdikten sonra, "gerçek" ikili dosya devralır ve artık sarmalayıcı komut dosyasının işlem tablosunda geçici olarak aynı yuvayı işgal eden herhangi bir izi kalmaz. "Gerçek" ikili, bir torun yerine onu başlatan şeyin doğrudan çocuğudur.

Sorunuzda G / Ç yönlendirmesinden de bahsediyorsunuz. Bu oldukça farklı bir kullanım durumudur execve kabuğun başka bir işlemle değiştirilmesi ile ilgisi yoktur. Ne zaman execbağımsız değişken yoksa, şöyle:

exec 3>>/tmp/logfile

komut satırındaki G / Ç yönlendirmeleri geçerli kabuk işleminde etkili olur, ancak geçerli kabuk işlemi çalışmaya devam eder ve koddaki bir sonraki komuta geçer.


1
İki durumun her ikisi için de ilişkili olduğunu söyleyebilirsin exec, kabuğa bir alt süreçte değil, aynı işlemde eylemi yapmamasını (bir komut yürütme veya yeniden yönlendirme gerçekleştirme) söyler.
Stéphane Chazelas

5

execBir Java programına işlem kimliği (PID) almak için bir kabuk yerleşik kullandım . Şimdi Java'nın içinden PID almanın bir yolu olabilir, ancak birkaç yıl önce yoktu. Bir işlemin kendi PID'si olduğunda, /var/run/yönetim programlarının çalışan işlemin PID'sini bilmesini sağlamak ve ikinci bir örneği önlemek için bunu bir PID dosyasına yazabilir ( '.pid' sonekine sahip dosya adlarını arayın). aynı sunucunun Bunun gibi bir şey çalışır:

exec java -cp=YourServer.jar StartClass -p $$

main()Sınıf yöntemindeki kod, StartClassbağımsız değişken ayrıştırmayı işler ve kendi işlem kimliğini bulabilir.


2

Eğlenmek için, kullanıcı süreci muhasebesi ve sınırları olan bir sistem üzerinde aşağıdaki programı (seçtiğiniz dilinize çevrilmiştir) arka planda çalıştırın.

while(true) fork();

İşlem tablosundaki izin verilen her yuva, çalışan programın kopyalarıyla dolu olduğuna göre, onu nasıl öldürmeyi düşünüyorsunuz? Kill (1) 'in başlatılması, sahip olamayacağınız başka bir işlem yuvası gerektirir. Kabuğun kendisini kill komutuyla değiştirmesi faydalı olacaktır ...

exec /bin/kill -9 -1

(Sisteminizin / bin / kill'de kill (1) olduğunu varsayar. "Exec` olan" -9 -1 "i" potansiyel olarak daha güvenlidir.) Bu, SIGKILL'i yapabileceğiniz her işleme gönderir.

(Not: İşlem sınırları her zaman yeni bir giriş için kabuğu için bir işlem yuvasına izin vermedikçe fırlatma kabuğunuzdan çıkış yapmayın. Bunu yaparsanız temizlemek biraz daha zor olabilir. Bunu kesinlikle yapmadım. 90'ların başı. Hayır.)


3
(1) Bu execdurumda faydalı olacak komutu gerçekten gösterdiyseniz, bu cevap biraz daha iyi olurdu. (2) Bu cevap biraz arkaiktir; killKomut büyük nedeni bu endişe, yıllardır bash bir yerleşik komutu olmuştur.
G-Man

@ G-Man: Öğenizin (2) bu cevabı OP'ye kesin bir yanıt haline getirdiğini anlıyor musunuz?
Eric Towers

Hayır, anlamıyorum. Lütfen bana açıkla.
G-Man, '

4
Seni takip etmiyorum. Soru tüm bash yerleşik komutlarının pratik örneklerini istemez ; bunun örneklerini ister exec- ve killbir yerleşik olanın aslında yerleşik ile hiçbir ilgisi yoktur exec.
G-Man 'Eski Monica'yı Geri Yükle'

1
Cevabınızla ilgili güncellemenizi okudum. (1) Bil bakalım ne oldu? İşlem tablosu doluysa, komut değiştirme (ör. `which kill`) De çalışmaz. (2) BTW, $(…)form form üzerinden tavsiye edilir `…`. (3) Ama dizinde tahmin etmekle ilgili tehlikeli bir şey yok. Yanlışlıkla yazarsanız exec /binn/kill, bir hata mesajı alırsınız ve kabuğunuz kaybolmaz. (4) Ama daha dizin Ne hakkında endişe gerekmez killiçindedir.  execKullanımları $PATH, sadece normal komutlar gibi, çok exec kill …(sahip varsayarak çalışır /binarama yolunda).
G-Man

1
  • Bu, Bruce'un bir sürecin PID'sini bilmeye ihtiyaç duyma örneğine benzer:

    (cmdpid = $ BASHPID; (uyku 300; "$ cmdpid" öldür) ve uzun süren komutu çalıştır )

    hangi sende

    1. Bir alt kabuk (dış (ve )) başlatın ,
    2. Alt kabuğun PID'sini bulun. ( $$size ana kabuğun PID'sini verecektir.)
    3. Zaman aşımından sonra işleminizi öldüren bir alt alt kabuğu ayırın ve
    4. 1. adımda oluşturduğunuz alt kabuk işleminde bir komut çalıştırın.

    Bu, long-running-commandsadece önceden belirlenmiş sınırlı bir süre için çalışacaktır . 

  • Bu biraz anlamsızdır, ancak giriş oturumunuzun geri kalanı için kök (veya başka bir kullanıcı) olmaya karar verirseniz, bunu yapabilirsiniz exec su.

    Aslında bunun gerçekten yararlı olacağı bir senaryo hayal edebiliyorum. Uzak bir sistemde oturum açtığınızı ve bazı nedenlerden dolayı bağlantıyı kesip yeni bir bağlantı başlatmayla ilgili bir sorun olduğunu varsayalım. Örneğin, uzaktaki sistemin bir programı izleyen bir güvenlik duvarı olduğunu varsayalım. Yaptığınız zaman bağlantı kurmanıza izin verildi ve kurulan bağlantılar kapanmıyor, ancak şu anda yeni bağlantılar kabul edilmiyor.

    Yapmak istediğiniz şeyi yaptınız ve oturumu kapatmaya hazırsınız. Arkadaşın Bob seninle odada ve uzak sistemde biraz iş yapmak istiyor - ama bağlantı kuramayacak. Yani, yazıyorsunuz exec su - bobve parola istemi göründüğünde, iş istasyonunu ona çevirin. Artık UID'nizle ilgili bir işlem yok (arka planda bir şey çalıştırmadıysanız), Bob dosyalarınızla uğraşamaz. Bağlantınızı etkin bir şekilde ele geçirmiş olacaktır (rızanız ve işbirliğinizle).

    Notlar:

    • Elbette koşmanıza izin verilmezse bu işe yaramaz su.
    • Günlüğe kaydedilir, bu nedenle birisine nedenlerinizi açıklamanız gerekebilir. Politikayı (güvenlik duvarı takvimi) atlattığınız için sorun yaşayabilirsiniz.
    • % 100 güvenli olduğunu garanti etmiyorum. Örneğin, whomuhtemelen adınızı gösterecektir. Bazı (kötü yazılmış) bir programın Bob'un siz olduğunu düşünmek ve ona kaynaklarınıza erişmesini sağlamak için bunu kullanması düşünülebilir.
    • Sistem denetim yaparsa, Bob'un eylemleri adınız altında denetlenebilir.

Çoğu mermide pratikte, mermilerin bir alt kabuktaki son komut için çatalı optimize (a;b)ettiği ile aynı olduğunu unutmayın (a;exec b). Tek istisna gibi görünüyor bashve mksh. Kullanımı execbunu garanti etmeye yardımcı olur.
Stéphane Chazelas
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.