사용자 프로세스를 종료하지 않고 Ctrl+C를 사용하지 않고 특정 기간(예: 1분) 동안 사용자 프로세스에서 strace를 실행하려면 어떻게 해야 합니까?
사용자 프로세스의 추적을 자동화하는 스크립트를 만들고 싶습니다.
답변1
timeout
in 을 사용하면 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 command
60초 안에 명령이 완료됩니다. TERM
프로그램이 기본적으로 실행되면 프로그램이 하나를 보냅니다. 옵션을 사용하여 얻고자 하는 신호를 지정할 수 있습니다 --signal
.
기간은 초, 분, 시간 또는 일 단위로 설정할 수 있으며 각 단위에는 사용할 항목을 결정하는 특정 접미사가 붙습니다.