Bir işlemi bash betiğinden nasıl ayırabilirim?


18

Ben komuttan çıktığınızda SIGINT sürece iletilmez böylece bir işlem bir bash komut dosyası ayırmaya çalışıyorum.

disownKomutu doğrudan terminalde kullandım , ancak bash'da, disownSIGINT'in iletilmesini engellemiyor. Bu betiğin amacı, openocd ve sonra gdb'yi tek bir çağrı ile başlatmaktır. Komut dosyası hiçbir zaman çıkmadığından (gdb çalıştırıyor) SIGINT hala gdb'den openocd'a iletiliyor;

Terminalde şöyle görünecektir:

$ openocd &    # run openocd demonized
$ disown $!    # disown last pid
$ gdb          # invoke GDB

terminalde bu sırayla çağrıldığında, SIGINT gdb'den openocd'ye geçirilmez. Ancak aynı çağırma bir bash komut dosyasındaysa, SIGINT geçirilir.

Herhangi bir yardım büyük mutluluk duyacağız.

ps bu sorun OS X'te ama aynı zamanda tüm Unix araçları için taşınabilir araçlar kullanmaya çalışıyorum.


nohuptam olarak doğru cevap değil. Ne istediğinizi daha doğru göstermek için bazı sözde kod veya örnek kod eklemeniz gerekir.
Bruce Ediger

1
Gibi bir araç kullanmaya açık mısınız screen?
Eric Renouf

Yanıtlar:


16

Bir işlemi bir bash betiğinden ayırmak için:

nohup ./process &

Eğer bash betiğinizi SIGINT(ctrl + c) ile durdurursanız veya örneğin kabuk gönderilmeden çıkarsa SIGHUP, işlem rahatsız edilmez ve normal olarak çalışmaya devam eder. stdout& stderrBir günlük dosyasına yönlendirilecektir: nohup.out.

Çıkışı terminalde görebildiğinizde ayrı bir komut yürütmek istiyorsanız, şunu kullanın tail:

TEMP_LOG_FILE=tmp.log
> "$TEMP_LOG_FILE"
nohup ./process &> "$TEMP_LOG_FILE" & tail -f "$TEMP_LOG_FILE" &

Neden nohupgerekli? Amacınız arasındaki fark nedir nohup COMMAND &ve COMMAND &hedefiniz yalnızca arka planda komut çalıştırmak ve terminali serbest bırakmaksa?
James Wierzba

@JamesWierzba Farklardan biri, kabuktan çıktıktan sonra bile çalışmaya devam etmek için komuta ihtiyacınız varsa, nohup'ın yoludur. Web'de binlerce kapsamlı açıklama var. Örneğin stackoverflow.com/questions/15595374/…
marc


4

Bulduğum çözüm, Annon Inglorion tarafından yazılmış ve web sitesinden indirilebilir bir 'ayır' programı içeriyor

Derlendiğinde, bir komut dosyasında aşağıdaki gibi kullanılabilir:

$ ./detach -p debug.pid openocd <args> # detach openocd
$ gdb <args>                           # run gdb
$ kill -9 $(cat debug.pid)             # end openocd process
$ rm debug.pid                         # remove file containing process id

Bu ilk satır yeni bir işlem oluşturur (openocd çalışıyor) ve işlem kimliğini daha sonra kullanmak üzere dosyada (debug.pid) saklar. Bu, Oliver'ın cevabında belirtildiği gibi pid için selamlama ile ilgili sorunları önler. Bir sonraki engelleme programından (gdb) çıktıktan sonra, pid'i depolayan dosya, ayrılmış işlemi doğrudan öldürmek için kullanılır.


Onaylayabilir, detachharikalar yaratır.
AS

2

basit ve taşınabilir bir çözüm:

echo "openocd" | at now #openocd starts now, but via the at daemon, not the current shell!
pid=$(ps -ef | grep "[o]penocd" | awk '{print $1}')  
echo "openocd is running with pid: $pid"
gdb

Bazı taşınabilirlik uyarıları: psseçenekler işletim sistemine bağlıdır! yerine bir varyantını kullanabilirsiniz: { ps -ef || ps aux ;} | grep '[o]penocd | cut -f 1. at(tuhaf, ama bu olur ...). $(...)gerçekten eski olmayan bir mermiye ihtiyaç duyar, aksi takdirde ters çentikler kullanın.


Bu tehlikeli görünüyor, pid için greftleme aynı adla birden fazla işlem çalışıyorsa, hatta başka bir işlem openocd kelimesini içeriyorsa beklenmedik şeyler yapabilir.
orion

1
@orion: Fikirleri vermek için basit bir örnek veriyorum, bahsettiğiniz bu endişelerden kurtulmak kolaydır: atprogramı başlatan ve bir dosya yerine pidini veren bir komut dosyası başlatın ve ana komut dosyası bunun için bekleyin dosyasını açın ve ardından pid'i okuyun.
Olivier Dulac

Tabii ki (aşırı basit) örneğimde grep'i awk içinde, sağ sütunda (genellikle 8 $) bir testle değiştirmelisiniz (sütunlar işletim sisteminize ve ps sürümünüze / seçeneklerine bağlıdır)
Olivier Dulac
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.