특정 기간 동안 strace 실행 프로세스를 종료하지

사용자 프로세스를 종료하지 않고 Ctrl + C를 사용하지 않고 특정 시간, 예를 들어 1 분 동안 사용자 프로세스에서 strace를 실행하는 방법은 무엇입니까?

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



답변

timeout에서 GNU coreutils, 당신은 할 수 있습니다 :

  • 프로세스 ID 받기
  • 운영 timeout 60 strace -p PID

다음은 예입니다.

test.sh:

#!/bin/bash

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

그것을 실행 :

$ ./test.sh
27121

실행 stracetimeout:

% 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 ~


답변

timeout가장 일반적인 해결책 인 것 같습니다. 입력 만하면 timeout 60s command명령이 60 초 후에 종료됩니다. TERM프로그램이 기본적으로 실행 중이 면를 보냅니다 . --signal옵션을 사용하여 원하는 신호를 지정할 수 있습니다 .

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


답변