Как я могу обнаружить, если система работает в systemd-nspawn контейнере?

В обоих

<file.txt  tee >(grep LITERAL) >(wc -l) >/dev/null

И:

{ { <file.txt tee /dev/fd/3 | grep LITERAL >&4; } 3>&1 | wc -l ;} 4>&1

Весь из tee, grep и wc запускаются одновременно. Что вопросы затем то, что происходит в конце.

wc только распечатает результат, когда он будет видеть конец файла на своем стандартном входе. В первом случае, именно тогда tee выходы, потому что затем tee закроет fd на другом конце канала это wc читает из (запущенный заменой процесса). Нет никакой гарантии этого grep считает весь его вход к тому времени, уже не говоря о записанном его вывод (учитывая, что каналы могут содержать вполне большой объем данных и это wc вероятно, будет быстрее, чем grep)

Во втором случае, wc будет видеть конец файла, когда все устройства записи к каналу, из которого он читает, закрыли свой конец канала. В этом случае, хотя, существует несколько устройств записи. tee (через его fd открываются на /dev/fd/3 и через его fd 3) и grep который также имеет fd 3 открытых для канала к wc (хотя это не делает использования из него, уже не говоря о записи к нему). Внутреннее { вероятно, вызовет дополнительный процесс подоболочки, который будет также иметь a fd 3 открытых и будут ожидать обоих tee и grep.

Это означает это wc только запишет его номер строки после grep вышел.

Вы записали этому надлежащий путь, который является путем закрытия fds, который не должен был открываться:

{ { <file.txt tee /dev/fd/3 4>&- | 
   grep LITERAL >&4 3>&- 4>&-; } 3>&1 | wc -l 4>&-;} 4>&1

Затем порядок не был бы гарантирован в оболочках, которые оптимизируют процесс подоболочки. Однако единственная оболочка, что я знаю это, делает ksh93 но ksh93 использование снабжает пар сокетом для каналов, таким образом, /dev/fd/3 не будет работать там над Linux, по крайней мере.

Для наблюдения, что выполняют процессы можно заменить grep с ps:

$ { { <file.txt tee /dev/fd/3 4>&- | ps -H >&4 3>&- 4>&-; } 3>&1 | wc -l 4>&-;} 4>&1
  PID TTY          TIME CMD
 8727 pts/5    00:00:00 bash
 8815 pts/5    00:00:00   bash
 8817 pts/5    00:00:00     tee
 8818 pts/5    00:00:00     ps
 8816 pts/5    00:00:00   wc

С bash, Вы видите, что дополнительный процесс оболочки, и видите, что ему также открыли канал на fd 3 с:

$ (p=$BASHPID; { { <file.txt tee /dev/fd/3 4>&- | lsof -ag "$p" -d3 >&4 3>&- 4>&-; } 3>&1 | wc -l 4>&-;} 4>&1)
COMMAND  PID PGID     USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    9843 9842 chazelas    3w  FIFO    0,8      0t0 153304 pipe
tee     9845 9842 chazelas    3w  FIFO    0,8      0t0 153304 pipe
lsof    9846 9842 chazelas    3r   DIR    0,3        0      1 /proc
2
05.04.2015, 10:33
1 ответ

SystemD-Detect-Virt может сказать вам, работает ли ваша система в VM / контейнере. Это требует системой DECECT-VILT внутри вашего контейнера, но системная документация на Minimal Condits предлагает вам просто построить пакет, который включает в себя только SystemD-deect-virt.

4
27.01.2020, 22:00

Теги

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