Belirli bir alt sürecin üst süreç kimliğini nasıl alabilirim?


49

Belirli bir çocuk parasını almak için ebeveyn parası nasıl alınır?

Bence / proc altında kontrol edebileceğimi biliyorum, bunu Ubuntu'da yapmanın daha akıllıca / daha iyi bir yolu olup olmadığını merak ediyorum. Ebeveynin öldürülmüş olabileceğini veya olmayabilir.

Teşekkürler

Yanıtlar:


58

Komut satırını kullanarak bir çocuğun işlem kimliğinden (PID) ana PID (PPID) nasıl elde edilir

kullanım ps -o ppid=

  • Örneğin , bir betikte kolayca kullanabileceğiniz ps -o ppid= 2072iadeler 2061, vs. ps -o ppid= -C fooişlemin PPID'sini komut ile verir foo. Ayrıca eski moda kullanabilirsiniz ps | grep: ps -eo ppid,comm | grep '[f]oo'.
  • Fuller açıklaması: ps -f 2072döner
    UID PID   PPID   C STIME TTY DURUMU ZAMANI CMD
    izx 2072   2061   0 07:16? S 0:00 / usr / lib / pulseaudio / darbe / gconf-yardımcı
    
  • pstreeİlişkisidir: pstree -s -p 2072:
    init (1) ───pulseaudio (2061) ───gconf-yardımcı (2072)
    

Satırları bölmeden pstree çağrıları başlatmanın (command + argümanları) yapmanın bir yolunu biliyor musunuz? Yüklemem, sonuç bir satıra kolayca sığsa bile, bağımsız değişken eklersem satırları otomatik olarak böler. Man sayfa kadar görünüyor gibi görünüyor, ama bir sebep vermez. Geçici çözümüm, PID'leri pstree'den çıkarmak ve ps -o args ...sonuçları kullanmaktan ibarettir , ancak bunun biraz kokusu vardır.
John P

Sadece beni şaşırtan bir şey: ppid= Pid'den sonraki ama boşluktan önce gerekli gibi görünüyor. İhmal edersem farklı sonuçlar elde ederim.
Gregory Arenius

8

Üst PID almak için sadece değişkenini kullanma :

echo $PPID

Bu ana pid'den bir komuta ihtiyacınız olursa:

cat /proc/$PPID/comm

Tam komut satırına ihtiyacınız varsa (tüm seçeneklerle):

cat /proc/$PPID/cmdline

açıklama

  • $PPID kabuk tarafından tanımlanır, ana işlemin PID'sidir.
  • içinde /proc/, her bir işlemin PID’si ile bazı direkleriniz var. Daha sonra eğer öyleyse cat /proc/$PPID/comm, PID'nin komut ismini yazarsınız.

Kontrol adam proc


1
Bu en iyi cevap. procfs bir çekirdek API'sidir. bir komutu yürütün ve çıktının ayrıştırılması saçmalıktır.
Massimo

Bu aynı zamanda potansiyel olarak en portatiftir, PPIDPOSIX standardının bir parçası olarak tanımlanır, bu nedenle herhangi bir POSIX uyumlu kabuk bunu uygun şekilde ayarlamalıdır. Bkz pubs.opengroup.org/onlinepubs/9699919799/utilities/...
RobV

2

pstreeKomut adına göre kullanma

Kullanarak pstree, çocuk işlem adına göre arama yapabilir ve ebeveynler, büyükanne ve büyükbaba ve çocuk sürecinin herhangi bir çocuğuyla birlikte İşlem Kimliğini (PID) alabilirsiniz:

$ pstree -hp | grep sleep
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(8414)

Bu durumda sleepalt komut ve PID 'dir 8414. Üst kimliği 841'dir ve denir display-auto-brightness. Büyükbaba veya büyükanne shbir işlem kimliği olan bir kabuktur ( ) 839. Büyük büyükbaba veya büyükanne cronbir işlem kimliği ile 795. Büyük-büyük-büyükbaba veya büyükanne de cronbir işlem kimliği ile 763.

sleepİsim yerine İşlem Kimliği ile arama yapmak için kullanabilirsiniz:

$ pstree -hp | grep 14653
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)

sleepİşlem kimliğinin olarak değiştiğine dikkat edin 14653. Ebeveyn (PID 841) 1 dakika uyur, bir saniye kadar uyanır ve ardından sleepyeni bir işlem kimliği alan yeni bir komut başlatır . Bu, sleeparamanın işlem kimliğine göre aramaktan daha kolay olmasının bir başka nedenidir .

Bu kod şunlardan alınmıştır: Gün ışığına ve gün batımına göre ekran parlaklığını otomatik olarak ayarlayıp bu soruya uyarlanmıştır.


Önyükleme işlemine kadar iç içe geçmiş bir zinciri görmek için ad yerine PID'yi kullanın:

$ pstree -aps 8541
systemd,1 splash fastboot kaslr
  └─cron,763 -f
      └─cron,795 -f
          └─sh,839 -c    /usr/local/bin/display-auto-brightness
              └─display-auto-br,841 /usr/local/bin/display-auto-brightness
                  └─sleep,8541 60

Not: Başka bir dakika geçti ve uyku komutu yeni bir PID (8541) alıyor.


Örnekte, bu yöntem PID 807 ile cron işlemi için işe yaramazdı.
Olorin

@Olorin Her iki örnekte de aşınabilir 807veya cronve aynı satır yeniden doğurulur, eğer ortaya çıkarsa daha fazla çocuk olur. Ancak soru, tüm çocukları değil ebeveynleri bulmaktı.
WinEunuuchs2Unix

Tam olarak - PID 807'nin ebeveyni bu çıktıyla nasıl buluyorsunuz? Yapamazsınız, çünkü 807'nin ebeveyni içermez.
Olorin

@Olorin cronun ebeveyni PID olan sistemd'dir 1. PID 1'i öldürebileceğini sanmıyorum.
WinEunuuchs2Unix

Bir şey öldürmek hakkında bir şey demedim. Açıklığa kavuşturmak için, şimdi pstree'nin ilk satırını almanın veya komut adı için grepping uygulamasının her zaman ana PID'i vereceğini iddia ediyorsunuz.
Olorin

0

ps -efj aynı için de kullanılabilir.

Örneğin,

> ps -efj | head
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root         1     0     1     1  0 Jul01 ?        00:00:13 /sbin/init splash
root         2     0     0     0  0 Jul01 ?        00:00:00 [kthreadd]
root         3     2     0     0  0 Jul01 ?        00:00:02 [ksoftirqd/0]
root         5     2     0     0  0 Jul01 ?        00:00:00 [kworker/0:0H]
root         7     2     0     0  0 Jul01 ?        00:06:44 [rcu_sched]
root         8     2     0     0  0 Jul01 ?        00:00:00 [rcu_bh]
root         9     2     0     0  0 Jul01 ?        00:00:00 [migration/0]
root        10     2     0     0  0 Jul01 ?        00:00:08 [watchdog/0]
root        11     2     0     0  0 Jul01 ?        00:00:08 [watchdog/1]
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.