Запуск скрипта после завершения загрузки wget (фоновый режим wget)

Я хотел бы запустить скрипт PHP после завершения загрузки wget. Это не проблема, и я могу использовать что-то вроде...

wget http://example.com && php script.php

НО! Я использую фоновую загрузку wget (wget -b) который возвращает что-то вроде Continuing in background, pid 12345,

Можно ли запустить wget в фоновом режиме и запустить скрипт после загрузки?

Спасибо, стабилитрон

1 ответ

Когда вы используете wget с опцией -b, команда создает подпроцесс в другом сеансе оболочки ( setsid). Исходный процесс завершается после запуска подпроцесса.

Подпроцесс выполняется в другом сеансе оболочки, поэтому мы не можем использовать команду ожидания. Но мы можем написать один цикл, который проверяет, запущен ли подпроцесс. Нам нужен pid подпроцесса.

К примеру:

wget -b http://example.com && \
(
   PID=`pidof wget | rev | cut -f1 | rev`; 
   while kill -0 $PID 2> /dev/null; do sleep 1; done;
) && \
php script.php &

Другой способ получить pid подпроцесса - это проанализировать вывод wget.

Дополнительно, для понимания того, как работает фоновая опция wget, вы можете увидеть исходный код на C:

...
pid = fork ();
if (pid < 0)
{
  perror ("fork");
  exit (1);
}
else if (pid != 0)
{
  printf (_("Continuing in background, pid %d.\n"), (int)pid);
  if (logfile_changed)
    printf (_("Output will be written to `%s'.\n"), opt.lfilename);
  exit (0);         
}
setsid ();
freopen ("/dev/null", "r", stdin);
freopen ("/dev/null", "w", stdout);
freopen ("/dev/null", "w", stderr);
...
Другие вопросы по тегам