Wie führe ich ein Programm für einen festgelegten Zeitraum aus?

7

Ich suche nach einer in Ubuntu integrierten Methode, mit der ich ein Skript oder Programm oder was auch immer für einen festgelegten Zeitraum ausführen kann.

Ich habe ein Programm gefunden, das dies auf eine Weise tut, die ich mag , aber das Paket ist für Ubuntu nicht verfügbar. Auf jeden Fall hoffte ich auf etwas Eingebautes.

Das einzige, woran ich denken kann, ist, die aktuelle Zeit abzurufen und 30 Minuten vor 'jetzt' einen Cron-Job zu setzen, der das Programm beendet. Ich hatte gehofft, dass es einen Weg gibt, dies zu tun, ohne ein Skript einzurichten, aber wenn ich muss, wird es nicht das Ende der Welt sein. Nach dem 30-Minuten-Intervall möchte ich meinen Laptop in einen Ruhemodus versetzen, dies kann jedoch von der Timer-Sache getrennt sein.

Danke im Voraus.

Teque5
quelle

Antworten:

14

Ich habe gerade folgendes geschrieben und es scheint zu funktionieren:

ping google.com& PID=$!; sleep 3; kill $PID

Natürlich sollten Sie Ping durch den Befehl ersetzen, den Sie ausführen möchten, und 3 durch ein Timeout in Sekunden. Lassen Sie mich wissen, wenn Sie eine ausführlichere Erklärung zur Funktionsweise benötigen.

Adam Byrtek
quelle
Dies wird in einem Syntaxfehler nach '&;' beendet. Zum Beispiel nur 'vlc &;' erhält den gleichen Fehler; aber ich sehe, was Sie versuchen zu tun ...
Teque5
Tut mir leid, ich habe es auf Zsh statt auf Bash getestet. Es funktioniert, wenn Sie das korrigierte Semikolon entfernen.
Adam Byrtek
Nun, wenn ich das Semikolon entferne, bekommt es nicht die PID. Ich erhalte: 'bash: kill: $!: Argumente müssen Prozess- oder Job-IDs sein'. Es versucht jedoch, es nach 10 Sekunden zu töten ...
Teque5
Entfernen Sie einfach vorher den Backslash !. Nochmals Entschuldigung für die Verwirrung.
Adam Byrtek
15

Warum nicht verwenden /usr/bin/timeout?

$ timeout --help
Usage: timeout [OPTION] DURATION COMMAND [ARG]...
  or:  timeout [OPTION]
Start COMMAND, and kill it if still running after DURATION.
Walzer
quelle
3

Eine einfache (und nicht viel getestete) Version von hatimerun:

#!/bin/sh

help(){
    echo "Usage"  >&2
    echo "  $0 -t TIME COMMAND" >&2
    exit 1
}

TEMP=`getopt -o t: -n "$0" -- "$@"`

if [ $? != 0 ] ; then 
    help
fi

eval set -- "$TEMP"

while true ; do
    case "$1" in
    -t) timeout=$2; shift  2;;
    --) shift; break;;
    esac
done

if [ -z "$timeout" ]; then
 help
fi

cmd="$*"

$cmd&
echo "kill $!" | at now+$timeout

Informationen zum Festlegen der Uhrzeit finden Sie in der Manpage von at . Wie bei atder minimalen Zeitauflösung beträgt 1 Minute.

Eine andere Möglichkeit ist die Verwendung von upstart anstelle dieses Skripts.

Florian Diesch
quelle
0

Verwenden von Perl:

perl -e "alarm 5; exec @ARGV" systemctl list-timers

Verwenden des Befehls timelimit:

sudo apt install timelimit    
timelimit -t5 node app.js

Verwenden des Timeout-Befehls:

timeout -sHUP time command

Rakib Fiha
quelle
2
Das ist schon in askubuntu.com/a/102328/760903
Olorin
1
@Olorin jetzt wird der Beitrag von OP bearbeitet, einschließlich anderer Lösungen sowie eines Beispiels des timeoutBefehls.
αғsнιη
@ αғsнιη Haben Sie etwas dagegen, eine kurze Frage zu Timeout und Timelimit-Befehl zu beantworten? Wenn ich den Befehl timeout und timelimit verwendet habe, habe ich nach dem Beenden dieses Zeitlimits einen solchen Fehler erhalten. myname@myname:~$ myname@myname:~$ myname@myname:~$ myname@myname:~$Bei jeder Eingabe wurde immer in derselben Zeile gearbeitet, anstatt zu einer anderen Zeile zu wechseln. Dann musste ich die Sitzung beenden und mich erneut anmelden. Der Perl-Befehl funktionierte jedoch einwandfrei, ohne dass ein Fehler auftrat.
Rakib Fiha
Entschuldigung, ich habe keine Ahnung, was dort passiert
αғsнιη
tput resetlöst dieses Problem
Rakib Fiha