특정 기간 동안 strace 실행

특정 기간 동안 strace 실행

사용자 프로세스를 종료하지 않고 Ctrl+C를 사용하지 않고 특정 기간(예: 1분) 동안 사용자 프로세스에서 strace를 실행하려면 어떻게 해야 합니까?

사용자 프로세스의 추적을 자동화하는 스크립트를 만들고 싶습니다.

답변1

timeoutin 을 사용하면 GNU coreutils다음을 수행할 수 있습니다.

  • 프로세스 ID 얻기
  • 달리기timeout 60 strace -p PID

여기에 예가 있습니다.

test.sh:

#!/bin/bash

while :; do
    echo "$$"
    sleep 100
done

달리다:

$ ./test.sh
27121

달리다 strace:timeout

% cuonglm at ~
% timeout 60 strace -p 27121
Process 27121 attached - interrupt to quit
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 27311
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
wait4(-1, 0x7fff374b8598, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn(0xffffffffffffffff)        = 0
rt_sigaction(SIGINT, {0x45c4d0, [], SA_RESTORER, 0x7fcdc10e05c0}, {0x443910, [], SA_RESTORER, 0x7fcdc10e05c0}, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
write(1, "27121\n", 6)                  = 6
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fcdc1a699d0) = 27328
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {0x443910, [], SA_RESTORER, 0x7fcdc10e05c0}, {0x45c4d0, [], SA_RESTORER, 0x7fcdc10e05c0}, 8) = 0
wait4(-1,

1분 후:

....
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fcdc1a699d0) = 27328
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {0x443910, [], SA_RESTORER, 0x7fcdc10e05c0}, {0x45c4d0, [], SA_RESTORER, 0x7fcdc10e05c0}, 8) = 0
wait4(-1,  <unfinished ...>
Process 27121 detached
% cuonglm at ~

답변2

timeout가장 일반적인 해결책인 것 같습니다. 그냥 입력하면 timeout 60s command60초 안에 명령이 완료됩니다. TERM프로그램이 기본적으로 실행되면 프로그램이 하나를 보냅니다. 옵션을 사용하여 얻고자 하는 신호를 지정할 수 있습니다 --signal.

기간은 초, 분, 시간 또는 일 단위로 설정할 수 있으며 각 단위에는 사용할 항목을 결정하는 특정 접미사가 붙습니다.

관련 정보