Lo descubrí:
Durante años, tuve lo siguiente en mi~/.zshrc
:
bindkey '\e[4~' end-of-line aka End
en lugar de
bindkey '\e[4~' end-of-line # aka End
Interesante que nunca me ha dado problemas hasta ahora.
Sudo forks (редактировать :не всегда, см. мой другой ответ )перед запуском указанной вами команды. Вы не можете использовать exec для отмены форка. Когда в bash вы используете exec, он полностью избегает форка, и поэтому он работает в bash -sudo otoh не имеет этой функции. Но вместо этого вы можете обойти эту проблему, переводя свою программу в фоновый режим и затем выходя из промежуточного процесса :
.sudo -u www-data bash -c "php -r 'sleep(2); echo 5;' &"
Это имеет некоторые другие побочные -эффекты, которые могут быть или не быть проблемой для вас, например, потеря исходной информации о родительском процессе и ожидание завершения процесса..
Со страницы руководства sudo (8):
As a special case, if the policy plugin does not define a close function and no pty is required, sudo will execute the command directly instead of calling fork(2) first. The sudoers policy plugin will only define a close function when I/O logging is enabled, a pty is required, or the pam_session or pam_setcred options are enabled.
В обычных случаях это означает, что если вы убедитесь, что ваш процесс отключен от TTY, он не будет использовать fork. Так например:
sudo -u www-data php -r 'sleep(2); echo 5;' < /dev/null > /dev/null 2>&1
позволит избежать дополнительного процесса. Если вам нужны некоторые выходные данные, направьте их в файл или аналогичный файл, не являющийся TTY, а остальные оставьте в /dev/null
, как показано выше.
Я заметил, что побочным эффектом остается отображение исходной команды sudo в списке процессов, но, возможно, вас это устраивает. В качестве альтернативы может быть какая-то функция php или аналогичная для вызова, чтобы изменить способ отображения процесса в списке процессов, чтобы исправить эту потребность.
ОБНОВЛЕНИЕ:
Во многих системах параметры pam включены по умолчанию. Их можно отключить, но имейте в виду, что есть некоторые побочные эффекты, такие как «ограничения ресурсов могут не обновляться для выполняемой команды». Подробнее см. sudoers (5 ). Чтобы отключить их глобально, вы можете добавить следующую строку в/etc/sudoers
:
Defaults !pam_setcred
Defaults !pam_session
Проверьте справочную страницу sudoers (5 ), чтобы узнать, как ограничить настройки, например. конкретные пользователи и т.п.; найдите «Тип по умолчанию _» на странице руководства.