Несколько процессов перенаправляют в один и тот же файл с >

Вы можете получить минимальную установку без большого количества вещей X, если не установите все рекомендации:

sudo apt-get install --no-install-recommends cuda

Чтобы вернуть безголовый сервер, удалите пакет cuda и выполните автоматическое удаление

sudo apt-get remove cuda
sudo apt-get autoremove

Я не уверен, что команды полностью правильны, но они должны дать вам подсказку.

3
04.11.2019, 17:10
1 ответ

При открытии файла на запись с использованием перенаправления >файл усекается , т.е. полностью очищается. Однако он не удаляется и создается заново.

Если одна команда начинает с усечения файла, а затем записывает в него что-то,и если другая команда сделает то же самое, позиция первой команды в файле не изменится. Это означает, что у вас есть две команды, записывающие в один и тот же файл в двух независимых позициях, одна из которых может перезаписывать вывод другой, в зависимости от порядка записи и количества записываемых данных .

Итак, да, данные в файле вполне могут представлять собой переплетенный беспорядок вывода обеих программ, но это будет зависеть от порядка записи в файл, а также от количества записываемых данных и времени выполнения. усечения файла.

Вот пример переплетения данных двух команд:

#!/bin/sh

( { echo hello; sleep 2; echo world; } | cat >file ) &
sleep 1
echo 123 >file &

wait

Вот что происходит в этом скрипте:

  1. Первая команда открывает файл для записи и усекает его. На него пишет hello\n.
  2. Через одну секунду вторая команда усекает файл и записывает в него 123\n. В этот момент указатель файла первой команды все еще указывает на файл с некоторым смещением.
  3. Первая команда продолжает запись world\nв файл.

В результате получается файл с нулевыми символами в середине:

$ hexdump -C file
00000000  31 32 33 0a 00 00 77 6f  72 6c 64 0a              |123...world.|
0000000c

Нули(00в приведенном выше выводе )происходят из-за того, что указатель файла первой команды не был сброшен усечением файла второй командой, поэтому образовалась «дыра». Вторая команда записала только 123\n, но перезаписала бы нули, если бы записала больше данных :

.
$ hexdump -C file
00000000  31 32 33 35 36 37 77 6f  72 6c 64 0a              |123567world.|
0000000c

Здесь я сделал вторую команду echo 1234567890, но в файле осталась только 1234567. Это происходит из-за того, что первая команда продолжает писать world\nв том месте, где находился ее указатель файла после того, как вторая команда закончила запись.

10
27.01.2020, 21:11

Теги

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