Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > *NIX системы: Общие вопросы > & останавливает скрипт вместо отправки в фон |
Автор: 02077461 15.7.2010, 16:58 | ||||
Собственно все просто: есть простой скрипт
Т.е. он должен запуститься, провисеть 2 секунды, написать "Done..." и отвалиться. Но вместо этого у меня на машине (Ubuntu 9.что-то там) от останавливается как будто я запустил просто команду, а потом нажал Ctrl+Z. При этом jobs выдает такой список (скрипты другие запускал):
Собственно вопрос: почему амперсанд работает так странно? |
Автор: 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:
и другой терминал, лучше что-то попроще, например xterm или прямо в консоли. Добавлено через 2 минуты и 10 секунд Да, может это еще зависит от конфигурации bash, т.е. файлы /etc/bash* и ~/.bash* |
Автор: 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 | ||
Посмотри предпоследнее мое сообщение. Это копипаст из консоли. |
Автор: 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, большое спасибо! Посмотрю еще на этот момент! |