web-dev-qa-db-fra.com

Quel est un moyen simple de laisser une commande s'exécuter pendant 5 minutes?

Existe-t-il un moyen simple de laisser une commande spécifique (uniquement terminable via Ctrl-C) exécutée automatiquement pendant 5 minutes?

Par exemple:

minute-command 5-minutes ping www.google.com

ou toute autre commande qui ne se termine pas.

J'aimerais pouvoir spécifier une limite de temps, pas seulement 5 minutes.

63
eckhart

Il y a (au moins) deux programmes qui fournissent cette fonctionnalité:

PRÉNOM

timelimit - limite efficacement le temps d'exécution absolu d'un processus

SYNOPSIS

timelimit [-pq] [-S killsig] [-s warnsig] [-T killtime] [-t warntime] command [arguments ...]

et

PRÉNOM

timeout - lance une commande avec une limite de temps

SYNOPSIS

timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]

Ils sont emballés comme suit:

$ dlocate `which timeout timelimit`
timelimit: /usr/bin/timelimit
coreutils: /usr/bin/timeout

Comparaison:

/-----------------------------+------------+----------------\
|            Feature          |  timelimit |     timeout    |
+=============================+============+================+
|   time to run               | -t time    | first argument |
+-----------------------------+------------+----------------+
|   terminate signal          | -s signal  | -s signal      |
+-----------------------------+------------+----------------+
|   grace period              | -T time    | -k time        |
+-----------------------------+------------+----------------+
|   kill signal               | -S signal  | (note 1)       |
+-----------------------------+------------+----------------+
|   propagate signals         | -p         | (note 2)       |
\-----------------------------+------------+----------------/

Remarques:

  1. timeout utilise toujours SIGKILL comme signal de dernier recours.
  2. timeout ne dispose d'aucune fonctionnalité permettant de quitter avec un signal lorsque le programme enfant le fait.

Les états de sortie des deux programmes diffèrent, mais il est difficile de les résumer soigneusement. Je vous suggère donc de consulter les pages du manuel vous-même.

Comme timeout est installé sur plus de systèmes par défaut (coreutils est un paquet standard dans de nombreuses distributions), je vous suggère de l'utiliser sauf si vous avez besoin des fonctionnalités supplémentaires fournies par timelimit.

64
Toby Speight

En fait, voici ce à quoi timeout est destiné:

TIMEOUT(1)                          User Commands                         TIMEOUT(1)

NAME
       timeout - run a command with a time limit

SYNOPSIS
       timeout [OPTION] DURATION COMMAND [ARG]...
       timeout [OPTION]

DESCRIPTION
       Start COMMAND, and kill it if still running after DURATION.

lx@lxtp:~$ dpkg -S /usr/bin/timeout
coreutils: /usr/bin/timeout
86
Gombai Sándor

Dans votre cas particulier, la plupart des implémentations de ping prennent en charge -c ou --count pour se terminer après un nombre particulier de pings:

ping -c 300 Host.example.com

Pour une solution plus générale, voir les autres réponses.

10
Toby Speight

Vous pouvez le faire avec un script simple comme ceci:

#!/bin/bash

#
# $1 is the time to let the program run, and $2, $3, ... are the command itself.
#

"${@:2}" &
PID=$!
sleep "${@:1:1}"
kill -2 $PID

(signal SIGINT = 2 utilisé conformément à la suggestion de Matija Nalis dans le commentaire ci-dessous).

Une explication de l'expression (non commune?) Bash $@:...: les paramètres de position, ($*, $@, "$*", "$@") admettent la spécification supplémentaire suivante, par exemple:

"${@:START:COUNT}"

ce qui signifie: parmi tous les paramètres, prenez-les en COMPTE, le premier à prendre est celui à la position START; si COUNT est omis, prenez-les tous jusqu'à la fin, en commençant par la position START. Rappelez-vous que $0 est le nom du programme. Si START est négatif, commencez à compter à partir de la fin et souvenez-vous que COUNT ne peut pas être négatif, le dernier argument est donc "${@:-1}". De même, presque always inclut les paramètres de position entre guillemets doubles.

8
MariusMatutiae

Puisque vous mentionnez ping dans votre exemple; cette commande a quelques options pour arrêter après un laps de temps spécifique:

  • w date limite Spécifiez un délai d'expiration, en secondes, avant que ping quitte quel que soit le nombre de paquets envoyés ou reçus. Dans ce cas, ping ne s'arrête pas après l'envoi du paquet count, il attend soit l'expiration de date limite, soit la réponse à la sonde count ou une notification d'erreur du réseau.
  • W délai d'attente Délai d'attente d'une réponse, en secondes. L'option n'affecte que le délai d'attente en l'absence de réponse, sinon ping attend deux RTT.

- man ping

4
user2428118