Bir işlemi öldürün ve Linux'ta 0 döndürmeye zorlayın?


16

Linux ortamında, bu işlemden döndürülen çıkış kodunun 0 olduğundan emin olurken, bir işleme nasıl kill sinyali gönderebilirim? Bunun için süslü bir GDB büyüsü yapmak zorunda mıyım yoksa farkında olmadığım süslü bir öldürme sinyali var mı?

Test durumu:

cat; echo $?

killall cat

Çeşitli kill sinyallerini denemek yalnızca 129, 137 ve 143 gibi farklı dönüş sinyalleri sunar. Amacım bir komut dosyasının çalıştırdığı bir işlemi öldürmek, ancak komut dosyasının başarılı olduğunu düşünmesini sağlamaktır.

Yanıtlar:


20

GDB'yi ve işlem kimliğini kullanarak işleme ekleyebilir ve callkomutu exit(0)bağımsız değişken olarak verebilirsiniz .

callçalışan program içindeki fonksiyonları çağırmanıza izin verir. Çağrı exit(0), dönüş kodu 0 ile çıkar.

gdb -p <process name>
....
.... Gdb output clipped
(gdb) call exit(0)

Program exited normally.

Tek satırlık bir araç olarak:

gdb --batch --eval-command 'call exit(0)' --pid <process id>

Program (g) libc'yi kullanacak yoksa bu olmaz eser, örneğin bir program düzeneği ile yazılmış: No symbol table is loaded. Use the "file" command. Ancak bu pek olası değildir.
Cristian Ciupitu

Bir yakut senaryo üzerinde çalıştı :-D
Mikhail

1
@CristianCiupitu Bu sorunun etrafında bir yol var. Bir sonraki sistem çağrısına girişte, hedef programın _exitsistem çağrısını 0bağımsız değişken olarak çağırmasına neden olacak şekilde ilgili kayıtları değiştirmeniz yeterlidir . Bu, CPU döngülerini döngüye sokmayan ve yakmayan herhangi bir işlemde işe yarayacaktır. İşlem sonsuz bir döngüde sıkışmazsa, gerekli talimatları çalıştırılabilirinde bir yerde bulabilir ve talimat işaretçisini oraya yönlendirirseniz aynı yaklaşımı kullanabilirsiniz.
kasperd

@Mikhail "yakut senaryosu" üzerinde çalıştı çünkü GDB ikili dosyası glibc ile bağlantılı olan yakut tercüman sürecine bağlandı.
Daniel

@kasperd, evet, yine de, ama daha kesin talimatlar iyi olurdu.
Cristian Ciupitu

8

Hayır. Kabuk yakaladığında SIGCHLD, koşulsuz olarak dönüş değerini sıfırdan farklı bir değere ayarlar, bu nedenle komut dosyasının veya kabuğun değiştirilmesini gerektirir.


3

Emin değilim ama listelenen sinyallerden herhangi biri alınırsa bu 0 ile çıkacaktır. Bir işlevi çağırmak vb. Gibi diğer eylemleri gerçekleştirebilirsiniz.

#!/bin/bash 
trap 'exit 0' SIGINT SIGQUIT SIGTERM

3

Bu tek astar benim için çalıştı:

/bin/bash -c '/usr/bin/killall -q process_name; exit 0'

Soruyu anladığınızı sanmıyorum. Hiçbir yolu yok, bu emir istenen şeyi başaracak. Bu senin komutunu kullanarak ne var: $ cat; echo $? Terminated 143.
kasperd

2
@ Thomas burada gösterilen kod satırınızı aslında 0 döndürür. Ancak öldürülen process_name, OP'nin istediği 0 döndürmez.
Daniel

2

Biraz huysuz bir yol, ama ..

SIGCHLD İşleyiciyi geçersiz kılarak işleminize bir sarıcı oluşturabilirsiniz. Örneğin:

#!/bin/bash
set -o monitor
trap 'exit(0)' CHLD
/some/dir/yourcommand

Bundan sonra, komut dosyasını işleminiz yerine bu sarmalayıcıyı çalıştırarak $ PATH içine daha erken koyarak ve aynı ada yeniden adlandırabilirsiniz.

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.