Laufband für einen bestimmten Zeitraum

9

Wie kann ein Benutzerprozess für einen bestimmten Zeitraum, z. B. 1 Minute, ausgeführt werden, ohne den Benutzerprozess zu beenden und ohne Strg + C zu verwenden?

Ich möchte ein Skript zur Automatisierung der Strace-Ausführung für einen Benutzerprozess erstellen.

adywp
quelle

Antworten:

14

Mit timeoutin GNU coreutilskönnen Sie Folgendes tun:

  • Holen Sie sich die Prozess-ID
  • Lauf timeout 60 strace -p PID

Hier ist ein Beispiel.

test.sh::

#!/bin/bash

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

Starte es:

$ ./test.sh
27121

Laufen Sie stracemit 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,

Nach 1 Minute:

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

timeoutscheint die allgemeinste Lösung zu sein. Geben Sie einfach ein timeout 60s commandund der Befehl endet in 60 Sekunden. Es wird ein gesendet, TERMwenn das Programm standardmäßig ausgeführt wird. Mit der --signalOption können Sie das Signal angeben, das Sie erhalten möchten .

Die Dauer kann in Sekunden, Minuten, Stunden oder Tagen eingestellt werden. Jeder von ihnen hat ein bestimmtes Suffix, um zu bestimmen, was verwendet wird.

Braiam
quelle