Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > *NIX системы: Общие вопросы > & останавливает скрипт вместо отправки в фон


Автор: 02077461 15.7.2010, 16:58
Собственно все просто: есть простой скрипт 

Код

php -r 'sleep(2); echo "Done...\n\n";' &


Т.е. он должен запуститься, провисеть 2 секунды, написать "Done..." и отвалиться. 
Но вместо этого у меня на машине (Ubuntu 9.что-то там) от останавливается как будто я запустил просто команду, а потом нажал Ctrl+Z. При этом jobs выдает такой список (скрипты другие запускал):
Код

nord@nord-laptop:~/projects/transactions$ jobs 
[1]   Stopped                 ./symfony task:b 
[2]   Stopped                 ./symfony task:b 
[3]   Stopped                 ./symfony task:b 
[4]   Stopped                 php symfony task:b
[5]   Stopped                 ./run.sh          
[6]   Stopped                 ./run.sh          
[7]   Stopped                 ./run.sh          
[8]-  Stopped                 ./symfony         
[9]+  Stopped                 ./run.sh > /tmp/symfony.log


Собственно вопрос: почему амперсанд работает так странно?

Автор: nickless 15.7.2010, 22:21
Какой $SHELL?

Добавлено через 40 секунд
ЗЫ У меня не на убунте в bash и zsh всё работает как надо.

Автор: 02077461 15.7.2010, 22:23
bash

Я уже не знаю что думать. скрипт
sleep 3 && echo "Done..." &
срабатывает как надо. А вот php почему-то в фоне стопится. 

Автор: nickless 15.7.2010, 22:33
Странно, попробуй вот что, другой язык (не шелл), например perl:
Код

perl -e 'sleep 3; printf "done\n"' &

и другой терминал, лучше что-то попроще, например xterm или прямо в консоли.

Добавлено через 2 минуты и 10 секунд
Да, может это еще зависит от конфигурации bash, т.е. файлы /etc/bash* и ~/.bash*

Автор: 02077461 30.8.2010, 17:52
Извините, что долго не отвечал. 
вот что очень интересно:
Код

nord@nord-laptop:~$ perl -e 'sleep 3; printf "done\n"' &
[1] 30716
nord@nord-laptop:~$
nord@nord-laptop:~$ done

[1]+  Готово            perl -e 'sleep 3; printf "done\n"'
nord@nord-laptop:~$ php -r 'sleep(3); echo "done\n"' &
[1] 30717
nord@nord-laptop:~$

[1]+  Остановлено  php -r 'sleep(3); echo "done\n"'
nord@nord-laptop:~$
nord@nord-laptop:~$
nord@nord-laptop:~$ jobs
[1]+  Остановлено  php -r 'sleep(3); echo "done\n"'
nord@nord-laptop:~$
nord@nord-laptop:~$


Т.е. perl скрипт выполнился, а php сразу "[1]+  Остановлено "

Добавлено через 1 минуту и 47 секунд
Цитата(nickless @  15.7.2010,  22:33 Найти цитируемый пост)
Добавлено через 2 минуты и 10 секунд
Да, может это еще зависит от конфигурации bash, т.е. файлы /etc/bash* и ~/.bash* 

.bashrc прикрепил в аттач.

Автор: IgorIV 30.8.2010, 19:52
02077461, потому что скрипт надо правильно писать, где последняя точка с запятой?

Автор: 02077461 31.8.2010, 09:18
IgorIV, поставил, ничего не поменялось.

Добавлено через 1 минуту и 43 секунды
Кстати, та же строка на других дистрах работает отлично, а на убунте (предпоследней и последней) такие вот чудеса. На Ubuntu forums так же ответить ничего не смогли.

Автор: bilbobagginz 31.8.2010, 10:45
02077461
сделай копи-пэйст того, что ты запускаешь СЮДА.
не вручную, а мышкой, или на худой конец ссылку на картинкой со сркиншотом.

Автор: 02077461 31.8.2010, 13:22
Цитата(bilbobagginz @ 31.8.2010,  10:45)
02077461
сделай копи-пэйст того, что ты запускаешь СЮДА.
не вручную, а мышкой, или на худой конец ссылку на картинкой со сркиншотом.


Посмотри предпоследнее мое сообщение. Это копипаст из консоли.

Автор: IgorIV 31.8.2010, 19:30
02077461, включай в php.ini журналирование и смотри его.

Автор: bilbobagginz 31.8.2010, 20:31
я немного посмотрел. дело вот какое - есть сигнал SIGTTOU.
он передается процессу, когда его посылают в bg, т.е. запускают в &.
если сигнал не обрабатывается, обработчик по умолчанию  дублирует посылку сигнала SIGSTOP.

насколько я понимаю по какой-то причине (возможно REPL, т.е. libedit ) в убунту не обрабатывает сам SIGTTOU => получает по морде SIGSTOPом.

судя по перловой доке перл умеет сам обрабатывать этот сигнал.


Автор: 02077461 1.9.2010, 09:16
bilbobagginz, С перлом то все окей, с PHP проблема. Но спасибо за наводку. 

Я тут проверил: и на PHP и на PERL kill -SIGTTOU действуют одинаково -- останавливают процесс в фоне. 
При этом перл, как я раньше говорил, отрабатывает в фоне нормально когда его запускаю с амперсандом. 

Автор: bilbobagginz 1.9.2010, 10:42
02077461
насколько я понимаю, Perl обрабатывает SIGTTOU по-особенному именно в случаях, когда его запускают из оболочки, с &.
я не смотрел код, но предполагаю, что при запуске интерпретатор смотрит на коммандную строку отца своего (по PPID-у), 
распарсивает ее, и если видит амперсанд, устанавливает свой обработчик сигнала.

я не к тому, что php так делает, а как-раз наоборот - что php так не должен делать.

и еще есть разница.

в Debian Stable (5.0.5) версия bash - 3.2
в Ubuntu 10.04 версия bash 4.2

надо и это проанализировать.



Автор: 02077461 1.9.2010, 11:38
bilbobagginz, большое спасибо! Посмотрю еще на этот момент!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)