2017-06-10 1 views
0

Ich möchte Shell-Skript verwenden Redis-Server zu starten und dann eine Protokolldatei überwachen:make redis Server Strg + C ignorieren, wenn sie von Shell-Skript gestartet

#!/bin/bash 
/path/to/redis/src/redis-server & 
tail -f /path/to/log/logfile.log 

Wenn ich das Skript und drücken Sie Strg + C laufen aus das Terminal, das tail -f beendet, was ich will, aber das Redis hat auch SIGINT erkannt und verlassen.

Ich habe versucht, das Skript wie folgt zu schreiben:

#!/bin/bash 
trap '' INT TSTP 
~/redis/src/redis-server & 
tail -f ./script1 

Dieses Mal die Dinge noch schlimmer, die tail -f während Redis noch erkannt SIGINT zu beenden abgelehnt und verlassen.

Es scheint, dass es einige Probleme gibt, die Redis in Bezug auf das Ignorieren von Signalen betreffen.

Mein Ziel ist es, tail -f reagiert auf Strg + C, während Redis dieses Signal ignorieren.

Bitte sagen Sie mir jemand, ob dies erreicht werden kann und wenn ja, geben Sie mir einen Rat?

+0

Kann das Verhalten, das Sie sehen, nicht reproduzieren. Auf welchem ​​Betriebssystem bist du? Welche Version von Redis? – Jack

+0

@Jack, ich benutze Ubuntu 12.04.5 und Redis 3.2.9 – Chris

+1

Eine Umgehungsmöglichkeit könnte es als 'setsid ~/redis/src/redisis-server &' –

Antwort

1

redis-server Fänge SIGINT (Strg + C), auch wenn SIGINT ignoriert wurde. Dies ist eine ungewöhnliche Wahl; Die meiste Software wird prüfen und SIGINT nicht fangen, wenn es bereits ignoriert wird.

Wenn es SIGINT empfängt, speichert es die Datenbank und fährt herunter.

Wenn Sie start it as a service, wird es nicht mit einem Terminal verbunden werden, und wird keine Ctrl + C Sie eingeben.

Wenn Sie es als Hintergrundjob in einer interaktiven Shell starten:

$ /path/to/redis/src/redis-server & 

Shell in eine Prozessgruppe setzen wird, die von dem Endgerät der Prozessgruppe unterschiedlich ist, und die Eingabe Strg + C gewonnen Habe keinen Einfluss darauf. (Wenn Sie es mit fg, in den Vordergrund bringen, sendet Ctrl + CSIGINT an das Programm).

Aber, wenn Sie ein Skript wie folgt ausführen:

#!/bin/bash 
/path/to/redis/src/redis-server & 
tail -f /path/to/log/logfile.log 

die Schale, die das Skript ausgeführt wird nicht interaktiv, und jedes Programm, das im Hintergrund beginnt (mit &) in der sein wird, gleiche Prozessgruppe wie die Shell. Wenn Sie also dieses Shell-Skript im Vordergrund ausführen, wird Ctrl + CSIGINT an die Shell senden, an redis-server und an tail.

Ctrl + C zu verhindern, dass SIGINT-redis-server in einem Fall wie diesen zu senden, müssen Sie entweder redis-server in einer eigenen Prozess Gruppe setzen oder es von Ihrem Terminal distanzieren.Sie können dies mit setsid tun, was beides tut:

#!/bin/bash 
setsid /path/to/redis/src/redis-server & 
tail -f /path/to/log/logfile.log 
Verwandte Themen