как перенаправить ожидающую загрузку Firefox в именованный канал?

Проблема не обязательно в команде nohup, а в &в конце командной строки.

На справочной странице для bashуказано:

If a command is terminated by the control operator &, the shell executes the command in the background in a subshell. The shell does not wait for the command to finish, and the return status is 0.

Технически оболочка разветвляет подоболочку для выполнения команды nohup..., а основная оболочка, выполняющая сценарий, немедленно переходит к следующей команде в сценарии. Таким образом, когда основная оболочка выполняет строку после строки nohup... &, команда nohup может еще не завершиться :, подоболочка может находиться в процессе ее загрузки для выполнения.

И команда nohupне обязательно завершается как таковая :, она устанавливает обработчик сигнала на игнорирование сигнала HUP, а затем пытается напрямую exec()выполнить команду java.... Если системный вызов exec()успешен, то процесс, который был nohup, преобразуется вjavaбез fork()создания нового процесса и выхода из , поэтому пока не будет никакого кода выхода для возврата.

Реальная команда nohupвернет код выхода только в том случае, если команда javaне может быть найдена или выполнена,или если в самой команде nohupвозникла внутренняя ошибка. Если системный вызов exec()выполнен успешно, код выхода будет доступен только тогда, когда сама команда javaзавершится.

Вот почему подобные попытки не дают желаемого результата:

nohup java -jar Xyz-port-0.0.1.jar &
wait $! 
if [ $? -ne 0 ]; then
    echo "Error in running Java"
fi

Если nohupне работает в фоновом режиме, waitполучит свой код выхода и позволит его проверить; но если nohupуспешно запустит java, то команда waitбудет продолжать ждать, пока не завершится java, поскольку и nohup, и javaбудут выполняться в одном и том же процессе один за другим.

Возможно, вы захотите сделать что-то подобное, как предложил @datUser:

STARTWAIT=20 #number of seconds to wait after starting the service

nohup java -jar Xyz-port-0.0.1.jar &
NEWPID=$!
for i in $(seq $STARTWAIT); do
    # test if the process still exists
    if ! kill -0 $NEWPID 2>/dev/null; then
        # Process has died: get its exit code, report error, stop waiting
        wait $!
        EXITCODE=$?
        echo "Process died after restart and reported result $EXITCODE" >&2
        break
    fi
    sleep 1
done
if kill -0 $NEWPID; then
    echo "The process was started and is still alive after $STARTWAIT seconds"
    echo "so I guess it's now running correctly"
fi

Обратите внимание, что моему сценарию присуща слабость. :Если процесс nohupped умирает, а другой процесс получает тот же номер PID в течение одной секунды, этот сценарий не заметит, что это уже не тот же самый процесс. (Но если ваши номера PID обновляются так быстро, у вас, вероятно, есть более серьезные проблемы.)

Для оптимального решения проблемы вам потребуется сценарий для настройки некоторого механизма времени -выхода, который останавливал бы команду waitв определенное заранее -время, а затем запускал wait()] системный вызов отслеживаемого процесса (, который достигается командой оболочки wait), потому что это может сделать только фактический родитель отслеживаемого процесса. Это довольно сложно реализовать в сценарии оболочки.

0
19.06.2020, 15:37
1 ответ

Я понял, что могу просто использовать tail -fпри частичной загрузке и передать его напрямую в wirehark.

0
18.03.2021, 23:26

Теги

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