2014-09-23 2 views
0

나는 우분투에서 실행되는 bash 스크립트를 가지고있다. 스크립트를 다시 시작하지 않고도 이제 실행할 수있는 행/명령을 볼 수 있습니까?Howto 디버깅 실행중인 bash 스크립트

스크립트가 가끔 종료되지 않는 것이 문제입니다. 이것은 실제로 재현하기가 어렵 기 때문에 (지금은 잡았습니다) 스크립트를 멈추고 디버깅을 시작할 수는 없습니다.

정말 도움이 될 것입니다.

P. 스크립트 논리는 이해하기 어렵 기 때문에 생각의 힘으로 왜 얼어 버린 것인지 파악할 수는 없습니다.

+0

[Bash 스크립팅, 오류 검사, 로깅] (0120-13995) > "연산자를 사용하여 error_log 파일에 항목을 만드는 명령을 삽입하십시오. –

+2

셸 스크립트를 디버그하는 일반적인 방법은'set -x'를 처음에 추가하는 것입니다.하지만 다시 시작해야합니다. 내가 생각할 수있는 유일한 제안은'strace'를 사용하는 것이지만, 그 출력을 스크립트 라인으로 변환하는 것이 얼마나 쉬운 지 모르겠습니다. – Barmar

+2

@FranzHolzinger 그는 스크립트를 다시 시작하지 않고 어떻게 할 것입니까? – Barmar

답변

1

쉘의 프로세스 ID (pid)를 찾으십시오. ps -ef | grep <script_name> 쉘 변수 $PID에이 pid를 설정해 보겠습니다. 하여이 $PID의 모든 자식 프로세스를 찾기 :

ps --ppid $PID 

당신이 찾을 수있는 하나 이상의 (예를 들어이 명령의 파이프 라인 시리즈에 붙어있는 경우). 몇 번이 명령을 반복하십시오. 변경되지 않으면 특정 명령에 스크립트가 멈추었습니다. 이 경우 실행중인 자식 프로세스를 추적 명령을 첨부 할 수 있습니다 실행되고 있는지

sudo strace -p $PID 

이 당신을 보여줄 것이다, 또는 일이 결코 어떤 이벤트를 기다리고 (파이프에서 읽기 등) 중 하나를 무한 루프.

변경 사항이 ps --ppid $PID 인 경우 스크립트가 진행 중이지만 어딘가에서 멈추었 음을 나타냅니다. 예 : 스크립트의 로컬 루프. 명령 변경으로 인해 스크립트에서 반복되는 위치를 알 수 있습니다.

+0

글쎄, 당신의 접근 방식은 적어도 저에게 뭔가를주었습니다. 'code' sudo strace -p $ PID'code'는'code'를 생성합니다 read (3,'code') digits는 lsof를 사용하는 파일 기술자입니다. 유닉스 소켓이라는 것을 발견했습니다. 그래서 스크립트는 어떤 시스템 작동을 요청하고 응답을 기다립니다. 그 소켓을 사용하여 그것으로부터. 불행히도, 그게 충분하지 않습니다. – long

+0

1-이 스크립트가 붙어있는 명령은 무엇입니까? 2'cat/proc/$ {PID}/fdinfo/3'의 출력을 공유 할 수 있겠습니까? –

+0

불행히도, 버그는 정말 희귀합니다 ... 다음에 재생할 명령을 실행하려고합니다. – long

관련 문제