Как stdin обрабатывается в этом сценарии bash?

Есть ли у вас монтирование на основе SHM, такое как /tmp или /var/tmp? Возможно, создаются временные файлы, которые потребляют память даже после завершения процесса. Эти файлы будут оставаться в памяти до тех пор, пока они не будут удалены или система не будет перезагружена. Проверьте монтирование в /etc/fstab, а также в mount на наличие записей в tmpfs.

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

journalctl --vacuum-size=500M
4
11.02.2017, 01:17
1 ответ

Магия!

В частности, оболочка будет вилкой (2) сама; это приводит к двум (в основном) идентичным копиям процесса оболочки; в частности, дочерний процесс оболочки наследует копию стандартного ввода от родительского процесса оболочки:

   *  The child inherits copies of the parent’s set of open file  descrip-
      tors.   Each  file  descriptor  in the child refers to the same open
      file description (see open(2)) as the corresponding file  descriptor
      in  the parent.  This means that the two descriptors share open file
      status flags, current file offset, and signal-driven I/O  attributes
      (see the description of F_SETOWN and F_SETSIG in fcntl(2)).

Затем дочерний процесс оболочки вызовет exec (3) для запуска java , что то есть процесс дочерней оболочки заменяет себя на java . Посредством этого вызова java получает копии файловых дескрипторов, унаследованных от родителя, и может воздействовать на стандартный ввод, таким образом переданный ему.

(Могут возникнуть сложности, если для файлового дескриптора установлен флаг «close on exec», но это не значение по умолчанию для стандартных, таких как стандартный ввод.)

Кроме того, если родительская оболочка не должна оставаться в стороне в памяти, пока выполняется java , код может быть записан как:

#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
exec java -jar $DIR/../bin-java/opsin/opsin.jar ${@:1}

Таким образом, java заменяет родительский процесс оболочки вместо того, чтобы оставлять процесс оболочки без необходимости оставаться в памяти.

Для получения более подробной информации, Advanced Programming in the Unix Environment (APUE) содержит несколько глав, посвященных различным системным вызовам fork, exec, dup и pipe.

5
27.01.2020, 20:53

Теги

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