самоуничтожающийся сценарий оболочки

Я не уверен, что есть все оболочки, но в Bash это возможно, хотя и не с безымянными каналами. Так что не с символом |. Но если вы создадите именованный канал:

mkfifo fifo

Тогда вы сможете его использовать:

<fifo cat | cat >fifo &

Теперь конвейер работает в фоновом режиме, но ничего не делает. Но если вы подадите трубу из-за пределов конвейера:

echo x >fifo

Конвейер разблокируется и будет работать вечно. Или пока вы не осушите трубу:

cat fifo

Вывод появится один раз:

x

Чтобы сделать это немного сложнее, конвейер может быть таким:

<fifo cat | xargs -I@ echo @x >fifo &

Таким образом, он добавит xк выводу на каждой итерации. Конечно, будет, но только после того, как начнутся итерации, то есть как только канал разблокируется, то есть как только будет что читать. Как и раньше, это можно запустить вручную:

echo x >fifo

А теперь посмотрите, что показывает top. Должно быть довольно много активности как cat, так и xargs.

И так же, как и раньше, если вы осушите конвейер, вы должны увидеть много xs в терминале, и конвейер заблокируется.

Возникает закономерный вопрос, почему опорожняется трубопровод. Почему команда catфиксируется в терминале, не оставляя ничего в цепи. Я не знаю этого.

1
06.07.2017, 17:37
2 ответа

В вашем примере вы не написали сценарий; это функция. Таким образом, вы применяете killк сеансу интерактивной оболочки. Интерактивные оболочки игнорируют большинство сигналов, включая SIGTERM, которые вы отправляете.

Поместите функцию и ее вызов в сценарий и запустите его. Гораздо больше шансов сделать то, что вы ожидаете.

6
27.01.2020, 23:14

попробуйте следующее, если вы хотите использовать его как функцию непосредственно в bash, соответственно, полученную из консоли.

function testKill
{
  kill $PPID
  echo  "no hello :-/"
}
0
27.01.2020, 23:14

Теги

Похожие вопросы