Süreç çatallama ile yürütme arasında genellikle karışıklık vardır.
Bir bash
kabuk isteminde yaptığınızda .
$ sh -c 'exec env ps'
Bu istemi veren P1 işlemi $
şu anda bash
kod çalıştırıyor . Bu bash
kod yürüten yeni bir işlem P2'yi çatallar ve yürütür /bin/sh
ve /usr/bin/env
yürütür /bin/ps
.
Yani P2 sırayla kodunu yürüttü bash
, sh
, env
ve ps
.
ps
(veya burada kullanacağımız komut dosyası gibi herhangi bir komutun) env
komut tarafından yürütüldüğünü bilmenin bir yolu yoktur .
Bütün yapabildiği kendi üst süreç kimliği ya olurdu bu durumda, hangi ne olduğunu öğrenmek ise P1 veya 1
eğer P1 başka bir işlem aralığında veya Linux üzerinde ölen bir olarak belirlenmiş edildiğini subreaper yerine 1
.
Bu süreç olduğunu emredeceğimi Daha sonra için sistem sorgulayabilir anda (olduğu gibi çalışan readlink /proc/<pid>/exe
veya Linux) ne (olduğu gibi son çalıştırılan komutun argümanlarla ps -o args= -p <pid>
).
Senaryonuzun neyin çağrıldığını bilmesini istiyorsanız, davetlinin bunu söylemesini sağlamak güvenilir bir yol olacaktır. Bu, örneğin bir ortam değişkeni ile yapılabilir. Örneğin script1
şu şekilde yazılabilir:
#! /bin/sh -
INVOKER=$0 script2 &
Ve script2
:
#! /bin/sh -
printf '%s\n' "I was invoked by $INVOKER"
# and in this case, we'll probably find the parent process is 1
# (if not now, at least one second later) as script1 exited just after
# invoking script2:
ps -fp "$$"
sleep 1
ps -fp "$$"
exit
$INVOKER
( genellikle ) için bir yol içerecektir script1
. Bazı durumlarda, bu göreceli bir yol olabilir ve yol, başlangıçtaki geçerli çalışma dizinine göreli olacaktır script1
. Bu nedenle , script1
aramadan önce geçerli çalışma dizinini değiştirirse, aradığı şey hakkında yanlış bilgi alırsınız. Bu nedenle, aşağıdaki gibi yazarak olduğu gibi mutlak bir yol (tercihen taban adını koruyarak) içerdiğinden emin olmak tercih edilebilir:script2
script2
$INVOKER
script1
#! /bin/sh -
mypath=$(
mydir=$(dirname -- "$0") &&
cd -P -- "$mydir" &&
pwd -P) && mypath=$mypath/$(basename -- "$0") || mypath=$0
... some code possibly changing the current working directory
INVOKER=$mypath script2
POSIX mermilerinde, $PPID
kabuğun başlatılması sırasında mermiyi yürüten işlemin üst öğesinin pid'ini içerecektir. Bundan sonra, yukarıda görüldüğü gibi, kimlik süreci $PPID
ölürse üst süreç değişebilir .
zsh
içerisinde zsh/system
modülü, sorgu mevcut olan akım (alt) kabuğun üst PID $sysparams[ppid]
. POSIX mermilerinde, yorumlayıcıyı yürüten işlemin geçerli ppid'ini (hala çalıştığını varsayarak) alabilirsiniz ps -o ppid= -p "$$"
. İle bash
, geçerli (alt) kabuğun ppid'ini ile alabilirsiniz ps -o ppid= -p "$BASHPID"
.