Unix: bis zur angegebenen Zeit schlafen

8

Gibt es einen (Semi-) Standard-Unix-Befehl, der bis zu dem in der Befehlszeile angegebenen Zeitpunkt inaktiv bleibt? Mit anderen Worten, ich suche nach etwas ähnlichem sleep Das würde Weckzeit und nicht Dauer kosten.

Zum Beispiel: sleeptill 05:00:00

Ich kann etwas programmieren, möchte das Rad aber lieber nicht neu erfinden, wenn es bereits etwas gibt.

Bonusfrage: Es wäre großartig, wenn es die Zeitzone dauern könnte (wie in sleeptill 05:00:00 America/New_York ).

bearbeiten Aufgrund der Art und Weise, in der ich mich gerade bewege, suche ich eher nach einer Lösung für "Schlaf bis T" als nach "Befehl bei T ausführen".

bearbeiten Um Zweifel zu vermeiden, wenn ich den Befehl um 18:00 Uhr ausführe und ihm sage, er soll um 17:00 Uhr aufwachen, erwarte ich, dass er 23 Stunden lang inaktiv ist (oder in einigen Eckfällen mit Sommerzeit zu tun hat, z 22 oder 24 Stunden.)

NPE
quelle
Du könntest benutzen cron, Ich vermute.
Bobby
Danke, aber für den Verwendungszweck muss es wirklich sein sleep -mögen.
NPE

Antworten:

12

Wenn Sie unter Unix mit einem anständigen Datumsbefehl arbeiten und Bash verwenden, können Sie das% s-Format zur Berechnung der Zeit verwenden.

sleep $(( $(date -j 1700 +%s) - $(date +%s) ))

(17.00 Uhr ist 17.00 Uhr und zeigt an, dass das Datum nicht tatsächlich eingestellt werden soll.)

w00t
quelle
(+1) für den Vorschlag. Wenn ich den Befehl um 18:00 Uhr ausführe und ihn auffordert, um 17:00 Uhr aufzuwachen, erwarte ich, dass er 23 Stunden lang inaktiv ist (oder, in einigen Eckfällen aufgrund der Sommerzeit, 22 oder 24 Stunden lang). Hier bricht der Vorschlag leider zusammen. [Ich musste auch die ändern -j zu -d damit es auf meinen Linux-Systemen läuft.]
NPE
6
@aix: Auf Linux (und anderen Systemen mit GNU-Datum) können Sie verwenden ausgefeilte Datumsangaben sowie date -d 'tomorrow 17:00'.
Gilles
2
@NPE, übrigens, kann man durch Restdivision ausgleichen: echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24)) % (60*60*24) )) (Möglicherweise gibt es nur einige Probleme mit Sommerzeitänderungen.)
hvr
9

Wie wäre es damit (die Ideen von w00t und Gille zu einer Funktion zusammenfassen)?

function sleep_until {
  seconds=$(( $(date -d "$*" +%s) - $(date +%s) )) # Use $* to eliminate need for quotes
  echo "Sleeping for $seconds seconds"
  sleep $seconds
}

Verwendungszweck:

sleep_until 8:24
Sleeping for 35 seconds

sleep_until '23:00'
Sleeping for 52489 seconds

sleep_until 'tomorrow 1:00'
Sleeping for 59682 seconds
Tyler Rick
quelle
8

Schauen Sie sich das Linux / Unix an at Befehl . Verwenden Sie das 5AM-Beispiel:

at 05:00 some_command

Es unterstützt auch Zeitzonen:

Ein Zeitzonenname von GMT, UCT oder ZULU (ohne Berücksichtigung der Groß- und Kleinschreibung) kann folgen, um anzugeben, dass die Zeit in Coordinated Universal Time angegeben ist. Andere Zeitzonen können mit der Umgebungsvariablen TZ angegeben werden.

Jeremy L
quelle
(+1) für den Vorschlag. Leider passt es natürlich nicht in meinen Workflow. Ich habe ein Skript, das eine Reihe von Dingen nacheinander ausführt, und ich möchte sicherstellen, dass bestimmte Schritte erst zu bestimmten Zeiten ausgeführt werden. Dies kann natürlich in etwas umgewandelt werden, das verwendet cron oder at, aber es wäre mühsam, damit fertig zu werden. Das ist der Grund, warum ich etwas suche sleep -mögen. Im Moment habe ich meine eigene geschrieben.
NPE
Ah, du willst also einen Sperrplan. Warum nicht eine Statusdatei haben, die jeden Schritt des Prozesses verfolgt?
Jeremy L
Könnte tun, aber es klingt etwas komplizierter, als ich denke, dass es sein muss. Die Schritte sind unterschiedliche Befehle, und das Shell-Skript koordiniert den Workflow. Es ist alles, was ich wirklich brauche, um im Drehbuch bis 17 Uhr schlafen zu können.
NPE
In diesem Fall könnte die Antwort von w00t genau das sein, wonach Sie suchen.
Jeremy L
Ja, das stimmt definitiv. Leider bricht es in einigen (für mich) wichtigen Fällen zusammen und hat keine Zeitzonen.
NPE