Задать вопрос

Как средствами php запустить выполнение linux-команды в фоновом режиме?

Для запуска скриптов на сервере в фоновом режиме я обычно использую команду nohup. Я попробовал вызвать её через exec и shell_exec без дополнительных параметров. При запуске команды скрипт зависает до того момента, пока команда не выполнится. Ниже код команды:

exec('nohup rsync -avz -e "ssh -p 22 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" user1@3.3.3.3:/original/ /destination/s_24/ && echo $? >> /destination/l_24.txt 2>&1 &');


Так как же мне запустить rsync в фоновом режиме средствами php так, чтобы скрипт не ждал пока выполнится команда?

Важные уточнения/наблюдения

1. PHP-скрипт запускается из браузера, а не из терминала
2. PHP работает через php-fpm, т.е. без Apache

Я заменил фоновую команду на упрощенную для анализа проблемы. Следующие варианты вешают скрипт:

sleep 15 &
nohup sleep 15 &
setsid sleep 15 &


Я предполагаю, это нормальное поведение для nohup. Команда, запущенная через nohup, теоретически может работать без терминала, если из него выйти. Но в вызове ведь нет команды выхода из терминала.

Тем не менее варианты:
nohup sleep 15 && exit &
nohup sleep 15 & exit

тоже не работают как надо.

Я также пробовал заменять exec на shell_exec, но это не дало никакого результата.
  • Вопрос задан
  • 1665 просмотров
Подписаться 6 Средний 7 комментариев
Решение пользователя Алексей Сундуков К ответам на вопрос (4)
alekciy
@alekciy
Вёбных дел мастер
Самое главное что нужно сделать это перенаправить stdout команды из nohup (через > к примеру). Упрощенный пример. Запускаем в фоне печать DA через 10 секунд после запуска без блокирования php процесса:
exec("nohup sh -c 'sleep 10 && echo \"DA\"' > nohup.php.out 2>&1 &");

Пример запуска:
$ date +%X
17:15:32
$ php -f test.php && date +%X && tail -F nohup.php.out
17:15:34
DA
^C
$ date +%X
17:15:45
$
Ответ написан