menjalankan strace untuk periode waktu tertentu

9

Bagaimana menjalankan strace pada proses pengguna untuk periode waktu tertentu, katakan 1 menit, tanpa menghentikan proses pengguna dan tanpa menggunakan Ctrl + C?

Saya ingin membuat skrip untuk mengotomatisasi eksekusi strace untuk proses pengguna.

adywp
sumber

Jawaban:

14

Dengan timeoutin GNU coreutils, Anda dapat melakukan:

  • Dapatkan id proses
  • Lari timeout 60 strace -p PID

Berikut ini sebuah contoh.

test.sh:

#!/bin/bash

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

Menjalankannya:

$ ./test.sh
27121

Jalankan stracedengan 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,

Setelah 1 menit:

....
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
sumber
2

timeouttampaknya menjadi solusi paling umum. Cukup ketik timeout 60s commanddan perintah akan berakhir dalam 60 detik. Ini akan mengirim TERMjika program berjalan secara default. Anda dapat menentukan sinyal yang ingin Anda dapatkan, menggunakan --signalopsi.

Durasi dapat diatur dalam detik, menit, jam atau hari, masing-masing memiliki akhiran tertentu untuk menentukan apa yang akan digunakan.

Braiam
sumber