Bash wait
возвращает 0 в этом случае, потому что он «помнит», что процесс 72009 был одним из его дочерних процессов, и он помнит коды завершения своих дочерних элементов, и этот код завершения был 0. (Документация здесь несколько вводит в заблуждение. поскольку в нем явно упоминаются «активные» процессы.)
За кулисами wait
определяет, соответствует ли данный идентификатор процесса одному из дочерних элементов оболочки, возможно, в задании; если это так, он проверяет, выполняется ли процесс. Если он все еще работает, он ждет его завершения. По завершении он определяет соответствующий код выхода (, который может быть только для процесса или для задания в целом ), и возвращает его. Существует много дополнительных сложностей для правильной обработки сигналов, подстановки процессов, управления терминалами и т. д., но здесь это не имеет значения.
Код выхода запоминается (как минимум )в таблице заданий. Вы можете увидеть это в действии, запустив две команды с разными кодами выхода(false &
иtrue &
)и дождавшись соответствующих идентификаторов процесса. Пока таблица заданий не очищена, wait
выдаст правильный код выхода. Запустите wait
без аргументов, чтобы удалить завершенные задания из таблицы заданий, и вы увидите, что больше не можете получать коды выхода предыдущих заданий.
Ошибка не требует пояснений -. Вы должны запустить либо как root
, либо использовать опцию run_as_launching_user
, как указано в руководстве vsftpd.conf
:
run_as_launching_user Set to YES if you want vsftpd to run as the user which launched vsftpd. This is useful where root access is not available.
Пожалуйста, обратите внимание, что включение этой опции может быть угрозой безопасности, поскольку опция chroot_local_user
, которую вы используете в настоящее время, и опция run_as_launching_user
являются взаимоисключающими