caffeinate
ожидает выполнения команды в новом процессе.
Чтобы интерпретировать функцию zsh
, вам нужна команда zsh
.
И вам нужно будет передать ей определение этой функции (, а также других функций, которые могут понадобиться ), например, с помощью:
mysleep() {
sleep 2
}
caffeinate zsh -c "$(functions mysleep);mysleep"
functions mysleep
сбрасывает определение функции mysleep
, которую мы передаем этой новой функции zsh
для интерпретации перед вызовом функции, так что zsh
, вызванная caffeinate
, заканчивается интерпретацией:
mysleep() {
sleep 2
};mysleep
Если сравнить с bash
:
mysleep() {
sleep 2
}
export -f mysleep
caffeinate bash -c "mysleep"
(, что на 2 символа короче, чем ), bash
подойдет:
execve("/path/to/caffeinate",
["caffeinate", "bash", "-c", "mysleep"],
["BASH_FUNC_mysleep%%=() { sleep 2\n}", rest-of-environment])
В то время как с zsh
мы получаем:
execve("/path/to/caffeinate",
["caffeinate", "zsh", "-c", "mysleep () {\n\tsleep 2\n};mysleep"],
[rest-of-environment])
Я вижу несколько преимуществ последнего подхода:
%
символов (, и даже если это не так, подумайте о sudo
, например ), мы не гарантируем, что caffeinate
распространит его на выполняемую команду bash
. sleep
, например, в этом примере ). bash
короче, в execve()
передается больше данных, что вносит больший вклад в ограничение E2BIG для этого системного вызова. Если вы хотите использовать среду, вы все равно можете:
FUNCS=$(functions mysleep) caffeinate zsh -c '
eval "$FUNCS";mysleep'
В случае caffeinate
здесь нам нужно только, чтобы caffeinate
выполнялся во время работы функции, не обязательно, чтобы он запускал функцию, мы можем использовать другие подходы, такие как:
mysleep | caffeinate cat
cat
будет работать до тех пор, пока работает mysleep
.mysleep
по-прежнему будет выполняться в отдельном процессе, и это влияет на стандартный вывод mysleep
.
mysleep 3> {fd}>(caffeinate cat)
решит обе проблемы.
Как и выше, это создает канал между mysleep
и cat
. Но конец канала для записи теперь находится на вновь выделенном файловом дескрипторе выше 10 (, хранящемся в $fd
), в который mysleep
обычно не записывается. Таким образом, cat
ничего не будет читать, но дождется конца -файла -в канале, что произойдет только тогда, когдаmysleep
(и все дочерние процессы, наследующие этот fd ), завершатся.
Недавно я настраивал аналогичную конфигурацию и просто разрешил Apache читать глобально из соображений производительности. Я использую модуль mpm _event _.
Вы должны принять во внимание, что Apache и PHP -FPM — это два отдельных процесса. Эти два имеют отдельные настройки и среды и не влияют друг на друга с точки зрения того, что PHP -FPM заботится о разрешениях Apache.
Apache должен читать статические файлы или иметь права на запись, когда вы загружаете файлы с помощью форм по старинке. Если вы загружаете файлы с помощью PHP-кода, срабатывает PHP -FPM. PHP -FPM обрабатывает только код PHP.
listen.owner = site1
listen.group = www-data
listen.mode = 0660
Используется для процесса Apache, поэтому он может передавать (запись ).php файлов в PHP -Unix-сокет FPM.
user = site1
group = site1
В пуле находится реальный пользователь/группа, под которой запускается PHP-код. Пользователь site1
не обязательно должен быть в группе www-data
.
Решением вашей проблемы является apache -mpm -itk.
Если вы оставите Apache для глобального чтения, вы можете использовать любой MPM (Многофункциональный -Модуль обработки ). apache -mpm -itk не совместим с многопоточными MPM. Единственный вариант — модуль mpm _prefork _. Несмотря на свое название apache -mpm -itk технически не является MPM. Это модифицированный префорк.
Не забудьте установить директиву open _basedir для каждого пула в PHP -FPM.
Я рекомендую Debian 10 (buster )в 2020 году.