Удаленная команда SSH не работает в функции

Я сделал это!

Вот мой intervalскрипт (также на github):

#!/usr/bin/env zsh
# Lets a line pass only once every $1 seconds.  If multiple lines arrive during
# the cooldown interval, only the latest is passed on when the cooldown ends.

INTERVAL="$1"

CHILD_PID=
BUFFER=$(mktemp)
CAN_PRINT_IMMEDIATELY=1
CAN_START_SUBPROCESS=1

# Reset state when child process returns
child-return () {
    CAN_START_SUBPROCESS=1
    CAN_PRINT_IMMEDIATELY=1
}
trap child-return CHLD

# Clean up when quitting
cleanup () {
    kill -TERM "$CHILD_PID" &> /dev/null
    rm "$BUFFER"
    exit
}
trap cleanup TERM INT QUIT

while read LINE; do
    # If we're just starting, just print immediately
    if [[ -n $CAN_PRINT_IMMEDIATELY ]]; then
        echo $LINE
        CAN_PRINT_IMMEDIATELY=
    else
        # Otherwise, store the line for later
        echo "$LINE" > $BUFFER
        # And spawn a subprocess to handle it one interval later, unless one is
        # already running.  With the SIGCHLD trap, the state variables will
        # reset when it exits.
        if [[ -n $CAN_START_SUBPROCESS ]]; then
            CAN_START_SUBPROCESS=
            (
                sleep $INTERVAL
                tail -n1 $BUFFER
            ) &
            CHILD_PID=$!
        fi
    fi
done

# Once we exhaust stdin, wait for the last child process to finish, if any.
if [[ -n $CHILD_PID ]]; then
    wait $CHILD_PID &> /dev/null
    cleanup
fi

Я заметил, что цикл, readгенерирующий строки, не всегда может отвечать за их печать, потому что программе иногда требуется асинхронно печатать строки, (когда они не получены, иногда даже спустя много времени после stdinзавершения ). Отсюда дочерний процесс.

Вот это работает, с вводом также tee >(sed)'ушел в сторону, чтобы наблюдать за синхронизацией:

GIF recording demonstrating that the script works on the example input given in the question

Это соответствует моей предыдущей диаграмме:

the wished-for result diagram from the question

1
07.09.2019, 20:39
2 ответа

Я создал похожую среду, но не сталкивался с такими проблемами, как вы упомянули, группа была успешно изменена.

Вы пробовали выполнять по одному? это работает? Если это работает, можете ли вы попробовать добавить 5-секундный сон в -между командами ssh и попробовать один раз?

0
28.01.2020, 00:00

Проблема связана с GID групп, я создаю локальную группу в каждом экземпляре с одинаковым именем, но они имеют разные GID, из-за этого последняя команда, которая выполняется в функциях, меняет разрешение.

0
28.01.2020, 00:00

Теги

Похожие вопросы