Bash komut dosyasından manuel olarak bir PID dosyası yazma


10

Uzun süredir çalışan bir programı çalıştıran ve program işlem kimliğini ayrı bir dosyada depolayan bir Bash-script'i nasıl yazabilirim?

Gibi bir şey istiyorum

#!/bin/bash
exec long_running_tool
echo `ps af |grep "long_running_tool" |awk '$5 == "long_running_tool" {print $1}'` > pid_file

Ancak tam olarak bunu psyaptıktan sonra after tool tamamlanmış olur.

Sürecin süreç kimliğini oluşturmanın bir yolu var mı?


2
Örnek kodunuz exec çalışmadığından çalışmaz, bu nedenle kabuk işlemi işlemle değiştirilir long_running_tool. Sonuç olarak, exec asla geri dönmez ve aşağıdaki satıra asla ulaşılmaz. Bkz help exec, execve(2).
Etienne Dechamps

@ e-t172 işaret ettiğiniz için teşekkür ederiz. Sonra "exec" i silerim.
DerMike

Yanıtlar:


12

"&" İle arka planda işlemi kolayca çalıştırabilir ve "$!" Kullanarak arka plan işleminin PID'sini alabilirsiniz.

#!/bin/bash
long_running_tool &
echo $! > pid_file

Sonra, isteğe bağlı olarak, $ bekleyin! işlem yürütmeyi tamamlayana kadar kabuğun engellenmesini istiyorsanız.


1
GÜNCELLEME: fg kullandığımda 'fg: 21: job (null) iş denetimi altında oluşturulmamış' olsun ve komut dosyası engellemiyor. Afedersiniz.
DerMike

"$ bekle!" fg için benzer bir etkisi olması gerektiğini aslında, bir komut dosyası içinde çalıştığını onaylayabilirsiniz. Muhtemelen göndermeden önce kontrol etmeliydim. benim hatam.
Jeremy Sturdivant

9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

Daha önce de belirtildiği gibi, PID'yi koruyarak belirtilen programla exec değiştirilir .bash

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.