Есть ли способ выполнить две команды параллельно и получить конец, который заканчивается первым? - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь изменить код, найденный здесь https://retropie.org.uk/forum/topic/17924/detect-idle-state-power-off-screen, чтобы он мог контролировать два js-входа одновременно. Как мне этого добиться?

Я борюсь с этой частью

inputActive=$(
    timeout ${inputWindow} \
        dd \
            if=/dev/inputs/js0 \
            of=/dev/null \
            count=${inputCount} \
            >/dev/null 2>&1;
    echo $?
)

if [ ${inputActive} -eq 0 ]; then

так что если есть активность на js0, он вернет 0. Я хотел бы иметь что-то вроде

inputActive=$(
    (
        timeout ${inputWindow} \
            dd \
                if=/dev/inputs/js0 \
                of=/dev/null \
                count=${inputCount} \
                >/dev/null 2>&1;
        echo $?
    );
    (
        timeout ${inputWindow} \
            dd \
                if=/dev/inputs/js1 \
                of=/dev/null \
                count=${inputCount} \
                >/dev/null 2>&1;
        echo $?
    )
)

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

1 Ответ

2 голосов
/ 27 марта 2019

Запустите обе команды в фоновом режиме и используйте wait -n, чтобы дождаться завершения одной из них. (Избавьтесь от всего inputActive=$(...; echo $?) бизнеса. Он не делает ничего полезного.)

timeout "$inputWindow" dd if=/dev/inputs/js0 of=/dev/null count="$inputCount" &> /dev/null &
timeout "$inputWindow" dd if=/dev/inputs/js1 of=/dev/null count="$inputCount" &> /dev/null &
wait -n

Если вы хотите проверить успех, вы можете использовать wait непосредственно в выражении if:

if wait -n; then
    echo "one of them succeeded"
else
    echo "one of them failed" >&2
fi

Кстати, вы можете использовать read вместо timeout и dd. read -N будет читать определенное количество символов, а read -t устанавливает время ожидания.

read -N "$inputCount" -t "$inputWindow" < /dev/inputs/js0 &
read -N "$inputCount" -t "$inputWindow" < /dev/inputs/js1 &
wait -n
...