Re: Амперснад в bash

2016-01-20 Пенетрантность yuri . nefedov

On Wed, 20 Jan 2016, Dmitry Derjavin wrote:


Пн, 18 янв 2016, 21:50, walter:


на деле же вывод процесса не скрывается. управление терминалом
возвращается, но вывод запущенной команды продолжает сыпаться в
терминал.


Насколько я понимаю, дело в том, что фоновый процесс имеет право
игнорировать SIGTTOU, который он получает каждый раз, когда пытается
вывести что-то на стандартный вывод, находясь в фоне. Оправдано такое
поведение или нет в каждом конкретном случае — вопрос спорный. Но
определённо это фича а не баг. Причём, фича очень древняя. ;)



 Проблема еще и в том, что в зависимости от настроек терминала
 сигнал SIGTTOU может посылаться или нет:
 http://curiousthing.org/sigttin-sigttou-deep-dive-linux

 Мне кажется, что это все проистекает из вопросов типа:
 кому надо и кому не надо посылать SIGTTOU в pipe
 comand1 | comand2 &
 И не надо забывать о stderr.

Ю.

Re: Амперснад в bash

2016-01-20 Пенетрантность Dmitry Derjavin
Ср, 20 янв 2016, 12:25, yuri nefedov:

>  Проблема еще и в том, что в зависимости от настроек терминала
>  сигнал SIGTTOU может посылаться или нет:
>  http://curiousthing.org/sigttin-sigttou-deep-dive-linux

Спасибо, очень интересно!

-- 
~dd



Re: Амперснад в bash

2016-01-19 Пенетрантность Dmitry Derjavin
Пн, 18 янв 2016, 21:50, walter:

> на деле же вывод процесса не скрывается. управление терминалом
> возвращается, но вывод запущенной команды продолжает сыпаться в
> терминал.

Насколько я понимаю, дело в том, что фоновый процесс имеет право
игнорировать SIGTTOU, который он получает каждый раз, когда пытается
вывести что-то на стандартный вывод, находясь в фоне. Оправдано такое
поведение или нет в каждом конкретном случае — вопрос спорный. Но
определённо это фича а не баг. Причём, фича очень древняя. ;)

Путаница возникла из-за слова «hidden», которое относилось к собственно
процессу, а не к его выводу. Имелось в виду, что мы не можем, например,
послать сигнал процессу, нажав Ctrl-C или Ctrl-\.

-- 
~dd



Амперснад в bash

2016-01-18 Пенетрантность walter_322
Столкнулся со странным поведением bash:

В Debian Handbook (последнем) пишут: 
"The command interpreter can also run programs in the background if the command 
is followed by a “”. By using the ampersand, the user resumes control of 
the shell immediately even though the command is still running (hidden from the 
user; as a background process)."

на деле же вывод процесса не скрывается. управление терминалом возвращается, но 
вывод запущенной команды продолжает сыпаться в терминал.

где-то на форуме альтовском читал, что раньше & действительно работал правильно 
(как и пишут в хендбуке).

это баг такой или новая фича?)
-- 
walter_322 



Re: Амперснад в bash

2016-01-18 Пенетрантность Иван Лох
On Mon, Jan 18, 2016 at 09:50:34PM +0300, walter_322 wrote:
> Столкнулся со странным поведением bash:
> 
> на деле же вывод процесса не скрывается. управление терминалом
> возвращается, но вывод запущенной команды продолжает сыпаться в
> терминал.
> 
 
> это баг такой или новая фича?)

Так должно быть.

Отсоединить процесс от терминала можно так
nohup proc&

> -- 
> walter_322 
> 



Re: Амперснад в bash

2016-01-18 Пенетрантность Alexander Galanin
On Mon, 18 Jan 2016 21:50:34 +0300
walter_322  wrote:

> Столкнулся со странным поведением bash:
> 
> В Debian Handbook (последнем) пишут: 
> "The command interpreter can also run programs in the background if the 
> command is followed by a “”. By using the ampersand, the user resumes 
> control of the shell immediately even though the command is still running 
> (hidden from the user; as a background process)."
> 
> на деле же вывод процесса не скрывается. управление терминалом возвращается, 
> но вывод запущенной команды продолжает сыпаться в терминал.

Это последствия неправильного прочтения мутной формулировки (про
"hidden from the user"). Всегда сыпалось и будет сыпаться.

> где-то на форуме альтовском читал, что раньше & действительно работал 
> правильно (как и пишут в хендбуке).

http://www.anekdot.ru/id/-22619007/

> это баг такой или новая фича?)

Это наименее затратное поведение. Заводить на каждый процесс по тройке
пайпов было бы накладно, а обрабатывать их все в командном
интерпретаторе - ещё и сложно. К тому же, не совсем ясно, куда же
девать вывод от такого «спрятанного» процесса.

-- 
Alexander Galanin



Re: Амперснад в bash

2016-01-18 Пенетрантность Oleksandr Gavenko
On 2016-01-18, Иван Лох wrote:

>> на деле же вывод процесса не скрывается. управление терминалом
>> возвращается, но вывод запущенной команды продолжает сыпаться в
>> терминал.
>
> Отсоединить процесс от терминала можно так
> nohup proc&

Дополню из nohup(1):

   If standard input is a terminal, redirect it from /dev/null.

   If standard output is a terminal, append output to 'nohup.out' if possible,
   '$HOME/nohup.out' otherwise.

   If standard error is a terminal, redirect it to standard output. To save
   output to FILE, use 'nohup COMMAND > FILE'.

Далее сделаю предположение что дескрипторы stdin, stdout, stderr копируются
между приложениями с вызовом execve(2):

  By default, file descriptors remain open across an execve().

И потому выставляются в зависимости от того что сконструировал getty / sshd
(снова предположение).

Единственное не ясно как libc / ld.so / kernel связывает сохраненные
дескрипторы с stdin/stdout...

Я видел такой код для изменения stdin:

   int new_stdin = open("/path/to/file, O_RDONLY);
   pid_t fk = fork();
   if (!fk) { // in the child
   dup2(new_stdin, 0);
   close(new_stdin);
   execl("program_name", "program_name", NULL);
   exit(127);
   } else if (fk < 0) {
// in parent with error from fork
   } else {
   // in parent with no error so fk = pid of child
   }
   close(new_stdin); // we don't need this anymore

Или список дескрипторов - просто копируется execl + stdin/stdout/stderr имеют
предопределенные номера, потому понятно где их искать?

-- 
http://defun.work/



Re: Амперснад в bash

2016-01-18 Пенетрантность Mikhail A Antonov
18.01.2016 21:55, Иван Лох пишет:
> On Mon, Jan 18, 2016 at 09:50:34PM +0300, walter_322 wrote:
>> Столкнулся со странным поведением bash:
>>
>> на деле же вывод процесса не скрывается. управление терминалом
>> возвращается, но вывод запущенной команды продолжает сыпаться в
>> терминал.
>>
>  
>> это баг такой или новая фича?)
> Так должно быть.
>
> Отсоединить процесс от терминала можно так
> nohup proc&
А чтоб оно ещё и nohup.out не создавало и не засирало - nohup cmd
>/dev/null 2&1 &
А если к этому процессу потом обратно подключиться и порулить хочется -
screen -d -m cmd


-- 
Best regards,
Mikhail
-
WWW: http://www.antmix.ru/
XMPP: ant...@stopicq.ru



signature.asc
Description: OpenPGP digital signature