bieganie przez określony czas

9

Jak uruchomić strace na procesie użytkownika przez określony czas, powiedzmy 1 minutę, bez przerywania procesu użytkownika i bez użycia Ctrl + C?

Chcę utworzyć skrypt automatyzujący wykonywanie strace dla procesu użytkownika.

adywp
źródło

Odpowiedzi:

14

Dzięki timeoutin GNU coreutilsmożesz wykonać:

  • Uzyskaj identyfikator procesu
  • Biegać timeout 60 strace -p PID

Oto przykład.

test.sh:

#!/bin/bash

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

Uruchom:

$ ./test.sh
27121

Uruchom stracez 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,

Po 1 minucie:

....
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 ~
Cuonglm
źródło
2

timeoutwydaje się być najbardziej ogólnym rozwiązaniem. Wystarczy wpisać, timeout 60s commanda polecenie zakończy się za 60 sekund. Wyśle a, TERMjeśli program jest domyślnie uruchomiony. Korzystając z tej --signalopcji, możesz określić sygnał, który chcesz uzyskać .

Czas trwania można ustawić w sekundach, minutach, godzinach lub dniach, każdy z nich ma określony przyrostek określający, co będzie używane.

Braiam
źródło