GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie sende ich ein Signal an das Programm, das in einem Docker-Container ausgeführt wird?

  • docker kill Wird verwendet, um ein Signal an den Hauptcontainerprozess zu senden, d. H. Prozess mit PID 1.
  • Jede Anwendung mit PID 1 kann Signale direkt verarbeiten. Der folgende Befehl beendet den Docker-Hauptprozess:$ docker kill --signal="SIGTERM" container-id/name
  • Aber eine Anwendung, die keine PID 1 hat, d. h. die Anwendung ist ein Hintergrundprozess:
    • Wir können Single nicht direkt an einen Hintergrundprozess senden, der im Docker-Container ausgeführt wird.
    • In diesem Fall müssen wir das benutzerdefinierte Signal im Shell-Skript, das als Einstiegspunkt läuft, abfangen und verarbeiten.
  • Nehmen wir folgenden Dockerfile . (Aktualisieren Sie es gemäß der Anwendung)
FROM centos:6.7
# Install/Deploye the service below.

# Copy the shell script.
COPY entrypoint.sh /home
EXPOSE 8080
ENTRYPOINT ["/home/entrypoint.sh"]
  • Unten ist die entrypoint.sh . (Aktualisieren Sie es gemäß der Anwendung). Angenommen, wir möchten einen init.d neu starten Dienst.

    #start the service
    /etc/init.d/<servicename> start
    pid="$!"
    
    # SIGUSR1- Single handler
    my_handler() {
        /etc/init.d/<servicename> restart
    }
    
    # Trap and handle the user defind singnal.
    trap 'my_handler' SIGUSR1
    
    # wait forever(Alive container.)
    while true
    do
        tail -f /dev/null & wait ${!}
    done
    
  • Erstellen Sie das Docker-Image und führen Sie den Container aus.
  • Jetzt können Sie den Dienst von der Host-Maschine neu starten:$docker kill --signal="SIGUSR1" container-id/name

Sie können docker kill --signal="<signal>" <container name or id> verwenden um ein beliebiges Signal an den Root-Prozess eines bestimmten Containers zu senden.

Siehe https://docs.docker.com/engine/reference/commandline/kill/#send-a-custom-signal--to-a-container


Sie können nsenter verwenden, um in Ihren Containerraum zu gelangen und Ihr Signal zu senden.

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid kill -SIGINT <PID of your program inside your container>

Weitere Informationen:http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/


Linux
  1. Wie führe ich ein Programm in einem Docker-Container aus?

  2. So führen Sie MySQL in einem Docker-Container aus

  3. So führen Sie einen Befehl in einem laufenden Docker-Container aus

  4. So beenden Sie einen Docker-Container

  5. So führen Sie einen Cron-Job in einem Docker-Container aus

So führen Sie Grafana in einem Docker-Container aus

So führen Sie Docker-Container aus

So führen Sie SSH in einen Docker-Container ein

So verwalten Sie Docker-Container

Geniale Möglichkeiten zum Ausführen eines Programms unter Linux

Wie man ein C-Programm unter Linux schreibt und ausführt