2011-01-09 11 views

Odpowiedz

8

Nie ma prawdziwego rozwiązania. Ale w większości przypadków skrypt czeka procesu potomnego:

ps --ppid $(pidof yourscript) 

Można też koparki NAST.SYGNAŁU w was shell Skript zrobić włączyć drukowanie poleceń:

#!/bin/bash 

trap "set -x" SIGUSR1 
trap "set +x" SIGUSR2 

while true; do 
    sleep 1 
done 

następnie użyć

+0

True. A twój przykład z pidofem jest fajny! Ale proponuję opcję -x, ponieważ mówię o skryptach powłoki i więcej informacji z ps: ps efl --ppid $ (pidof -x yourscript) – nealmcb

+0

Już miałem zasugerować coś podobnego; teraz wiem o opcji '--ppid'. Dzięki. –

12

Niedawno znalazłem się w podobnej sytuacji. Miałem skrypt powłoki, którego nie można było zidentyfikować za pomocą innych metod (takich jak argumenty itp.).

Istnieje wiele sposobów, aby dowiedzieć się o wiele więcej o uruchomionym procesie, niż można by się spodziewać.

Użyj lsof -p $pid, aby zobaczyć, jakie pliki są otwarte, co może dać ci pewne wskazówki. Zauważ, że niektóre pliki, podczas "skasowania", nadal mogą być otwarte przez skrypt. Dopóki skrypt nie zamknie pliku, nadal będzie mógł go odczytać i zapisać - a plik nadal zajmuje miejsce w systemie plików.

Użyj strace, aby aktywnie śledzić wywołania systemowe używane przez skrypt. Skrypt odczyta plik skryptu, dzięki czemu można zobaczyć niektóre z poleceń, ponieważ są one czytane przed wykonaniem. Sprawdzić read poleceń poleceniem:

strace -p $pid -s 1024 

To sprawia, że ​​struny polecenia drukowania do 1024 znaków (normalnie komenda strace by obciąć ciągi znacznie krótsze niż).

Sprawdź katalog /proc/$pid, aby wyświetlić szczegółowe informacje na temat skryptu; w szczególności uwaga, zobacz /proc/$pid/environ, która da ci środowisko procesu oddzielone przez wartości zerowe. Aby przeczytać ten „plik” poprawnie, użyj polecenia:

xargs -0 -i{} < /proc/$pid/environ 

Ty możliwe, że rura do less lub zapisać go w pliku. Istnieje również /proc/$pid/cmdline, ale możliwe jest, że poda tylko nazwę powłoki (na przykład -bash).

+0

+1 za udzielenie odpowiedzi na pytanie. Podczas debugowania już działającego skryptu, który może mieć bardzo sporadyczny problem, którego nie można odtworzyć, innym prostym poleceniem, którego możesz użyć, jest 'top' - możesz stwierdzić, że proces lub jego dziecko zajmują dużo CPU, co może oznaczać nieskończoną pętlę . – Jess

+0

+1 za bardzo przydatne informacje. Dla mnie 'cat/proc/$ pid/environ' daje mi sporo spłaszczonych wyników, ale' xargs -0 -i {} highBandWidth

+1

To samo, również ma puste linie. Działa to dla mnie: xargs -0 -n 1 echo jamshid

3

Zastosowanie pstree pokazać co komenda linux/wykonywalny skrypt dzwoni na przykład 21156 jest pid mojego skryptu wiszącej:

ocfs2cts1:~ # pstree -pl 21156 
 
activate_discon(21156)───mpirun(15146)─┬─fillup_contig_b(15149)───sudo(15231)───chmod(15232) 
 
             ├─ssh(15148) 
 
             └─{mpirun}(15147)

tak, wiem, że to wisi na polecenie chmod.Następnie pokazać ślad stosu przez:

ocfs2cts1:~ # cat /proc/15232/stack 
 
[<ffffffffa05377ef>] __ocfs2_cluster_lock.isra.39+0x1bf/0x620 [ocfs2] 
 
[<ffffffffa053856d>] ocfs2_inode_lock_full_nested+0x12d/0x840 [ocfs2] 
 
[<ffffffffa0538dbb>] ocfs2_inode_lock_atime+0xcb/0x170 [ocfs2] 
 
[<ffffffffa0531e61>] ocfs2_readdir+0x41/0x1b0 [ocfs2] 
 
[<ffffffff8120d03c>] iterate_dir+0x9c/0x110 
 
[<ffffffff8120d453>] SyS_getdents+0x83/0xf0 
 
[<ffffffff815e126e>] entry_SYSCALL_64_fastpath+0x12/0x6d 
 
[<ffffffffffffffff>] 0xffffffffffffffff

Och, chłopcze, to prawdopodobnie błąd zakleszczenia ...

+0

Tak, jest to zakleszczenie jądra. Naprawiłem to :-) –

Powiązane problemy