Sen kullanabilirsiniz sh -c
ve exec
hatta komutunun PıD'YI almak için önce o çalışır.
Başlamak için myCommand
, PID'i çalışmaya başlamadan önce yazdırılacak şekilde kullanabilirsiniz:
sh -c 'echo $$; exec myCommand'
Nasıl çalışır:
Bu, yeni bir kabuk başlatır, bu kabuğun PID'sini yazdırır ve daha sonra aynı PID'ye sahip olmasını sağlayarak kabuğunu komutunuzla değiştirmek için exec
yerleşimi kullanır . Kabuğunuz yerleşik bir komutu çalıştırdığında, kabuğunuz aslında kendi ayrı PID'sine sahip olan ve daha sonra komut haline gelen yeni bir kopyasını oluşturma davranışından ziyade, bu komut haline geliyor .exec
Bunu asenkron yürütme (ile &
), iş kontrolü veya aramayı içeren alternatiflerden çok daha basit buluyorum ps
. Bu yaklaşımlar gayet iyi, ancak onları kullanmak için belirli bir nedeniniz olmadığı sürece - örneğin, belki de komut zaten çalışıyor, bu durumda PID'sini aramak veya iş kontrolünü kullanmak mantıklı olacaktır - önce bu yolu düşünmenizi öneririm. (Ve bunu başarmak için kesinlikle karmaşık bir senaryo veya başka bir program yazmayı düşünmeyeceğim).
Bu cevap , bu tekniğin bir örneğini içerir.
Bu komutun bölümleri zaman zaman ihmal edilebilir, ancak genellikle değil.
Kullandığınız kabuk bir Bourne stili olsa ve dolayısıyla exec
bu semantik ile yerleşik yapıyı desteklese bile , genellikle bu amaç için sh -c
yeni, ayrı bir kabuk işlemi oluşturmaktan kaçının (veya eşdeğeri) kullanmaktan kaçınmamalısınız.
- Kabuk bir kez olunca
myCommand
, sonraki komutları çalıştırmak için bekleyen bir kabuk yoktur. Kendisini değiştirdikten sonra sh -c 'echo $$; exec myCommand; foo
kaçmayı deneyemezdi . Bunu en son komut olarak çalıştıran bir komut dosyası yazmıyorsanız, yalnızca diğer komutları çalıştırdığınız bir kabukta kullanamazsınız .foo
myCommand
echo $$; exec myCommand
- Bunun için alt kabuk kullanamazsınız .
(echo $$; exec myCommand)
sözdizimsel olarak daha güzel olabilir sh -c 'echo $$; exec myCommand'
, ancak $$
içeri (
)
girdiğinizde, alt kabuğun kendisinden değil, üst kabuğun PID değerini verir. Ancak, yeni komutun PID'i olacak olan deniz kabuğunun PID'sidir. Bazı kabukları Eğer altkabuk en PID, bulmak için kendi taşınabilir olmayan mekanizmalar getirmesi olabilir bunun için kullanın. Özellikle, Bash 4'te , (echo $BASHPID; exec myCommand)
çalışır.
Son olarak, bazı mermilerin, daha sonra bir şey yapmak zorunda kalmayacakları biliniyorsa (örneğin, ilk önce forgo bıraktıkları gibi) bir komutu çalıştırdıkları bir optimizasyon yapacağını unutmayın exec
. Bazı mermiler, çalıştırılacak en son komut olduğu zaman bunu yapmaya çalışır, bazıları ise sadece komuttan önce veya sonra başka bir komut olmadığında ve diğerleri de bunu yapmaz. Bunun etkisi, eğer yazmayı exec
ve kullanmayı unutursanız sh -c 'echo $$; myCommand'
, bazen bazı kabukları olan bazı sistemlerde size doğru PID'yi vermesidir. Bu tür davranışlara güvenmeyi ve bunun yerine her zaman ihtiyaç duyduğunuz şeyi dahil etmeyi öneririm .exec