Как сохранить избыточный корневой каталог для офлайнового использования?

Когда вы:

exec 3<> /dev/ttyACM0

... вы открываете файл-дискайптор для чтения/записи на usb serial tty на 3, который автоматически наследуется детьми - например, клонированные подоболочки - и поэтому вы можете прочитать его с помощью cat позже в вашем фоновом конвейере.

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

exec 3<&-

... и закроете этот дескриптор для текущих процессов оболочки скрипта. Вместо этого...

cat > file &

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

Вы можете сделать:

cat /dev/tty

... по вашей просьбе, чтобы аппроксимировать это поведение.

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

head -n"$GUARANTEED_NUM_AVAIL_INPUT LINES" <&3 >>file

... или с помощью sed [num]q или аналогичным способом. Таким образом, Вам следует вообще избежать необходимости использования |pipe, и, скорее всего, Вы можете полностью опустить и фоновый рисунок. В противном случае Вы можете убить cat:

cat <&3 >>file &
sleep 1 && kill "$!"

... но, вероятно, в этом нет необходимости, так как выход из входного сигнала намного проще.

В стороне, стоит отметить, что ваш скрипт уже полностью состоит из портативного синтаксиса, и поэтому, вероятно, стоит изменить строку #!/bin/bash и вместо этого вызвать более легкий вес - и, вероятно, быстрее - оболочки вместо этого. Я рекомендую dash для чего-то подобного. Посмотрите здесь , если вас интересует эта линия мышления для q&a о сравнении производительности различных оболочек - чтобы включить как bash, так и dash.

1
11.03.2015, 01:47
1 ответ

Пара вариантов вашего варианта 2 кажутся правдоподобными. Я продолжу считать, что вы обычно входите в систему с помощью $USER на $HOME, как и в вашем сценарии. Вы заявили, что не можете скопировать файлы с $HOME на $CHOME из-за проблем с разрешениями ($USER не может получить доступ к $CUSER), и вы не можете обойти его с помощью root из-за вашего root_squash.

2a. Настройте разрешения для $USER и $CUSER таким образом, чтобы они принадлежали к общей первичной группе. Установите маску umask 002 для обоих, чтобы они создавали файлы с групповыми правами доступа так же, как и для пользователя. Обновите все файлы в $HOME и $CHOME так, чтобы право собственности на группу принадлежало этой новой группе. Используйте rsync -avH --no-владельца [--delete] $HOME/ $CHOME/ для копирования измененных файлов. Запустите пару заданий cron (одно для $USER и одно для $CUSER), чтобы исправить ошибки в разрешениях и членстве в группах всех файлов.

2b. Оставьте все "как есть" и скопируйте файлы с одной учетной записи на другую, используя rsync с клиента на себя, меняя идентификационные данные по всему соединению: rsync -avH [--delete] $HOME/ ${CUSER}@localhost:

0
28.01.2020, 01:43

Теги

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