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.


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.


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.

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.


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



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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.