Возможен ввод pdf из файла?

Кажется, у тебя две проблемы:

  • файловая система заполнена
  • файл tar.gz усечен, т.е. не завершен согласно ошибкеgzip: stdin: unexpected end of file

Вторая проблема, вероятно, связана с первой проблемой :не было места для сохранения полного файла tar.gz при загрузке (или любым другим способом получения файла ).

Вы пишете "Похоже, у меня достаточно места на диске". Что привело вас к такому выводу, поскольку вы пишете в том же абзаце :«Почему корень показывает «Использовать%» как 100%?», что означает, что файловая система заполнена... Пара блоков свободна, но это может быть связано, например, с тем, что временные файлы были удалены каким-либо демоном.

Ваш df /dev/sdaуказывает dfпоказать файловую систему, в которой хранится указанный файл; он не показывает вам, сколько места на этом устройстве.

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

Ваша корневая файловая система находится в диспетчере логических томов LVM (). Есть вероятность, что в группе томов есть неиспользуемое пространство. Свяжитесь с

# vgdisplay

Там будет строка Free PE / Size, если она не равна нулю, то вы можете выделить это пространство для вашей корневой файловой системы. Если вы хотите выделить все доступное пространство, используйте:

# lvresize --extents +100%FREE /dev/mapper/centos-root

После увеличения размера устройства необходимо увеличить саму файловую систему, чтобы использовать дополнительное пространство. Здесь я предполагаю, что файловая система — ext4, сначала проверьте mountи посмотрите тип в списке.

# resize2fs /dev/mapper/centos-root

Это будет использовать все доступное пространство для файловой системы.

РЕДАКТИРОВАТЬ / Дополнительная информация:

40 МБ, которые отображаются как свободные, вероятно, слишком малы, чтобы их можно было добавить в любом случае, но LVM необходимо записать в свою конфигурацию, чтобы выполнить свою задачу, а для этого нет места... Итак, сначала вам нужно освободить место в каким-то образом,Я обычно иду в /var/log/, чтобы удалить старые файлы журнала в такой ситуации.

1
28.09.2019, 16:12
3 ответа

Мне удалось связаться с одним из pdshразработчиков и узнать следующее:

What you want is "stdin broadcast" and unfortunately support for this was never added to pdsh. It would be a nice feature, but there was not historically much need for it, so it wasn't ever done.

Что, кажется, подтверждает то, что уже было установлено в этом посте.

Однако за ним последовал:

BTW, it isn't that it is impossible to do the stdin broadcast. Parallel launchers that are part of HPC schedulers can do it, like srun(1) and the like. The mechanism is that stdin is read in once, then copied to a buffer for each remote process, i.e. the duplication is done inside of the parallel launcher.

The reason for the follow-up is that there are some misleading answers on that stackexchange post.

Another way to get around the serial for-loop problem would be to run ssh from GNU parallel or pdsh -R exec. Example with pdsh -R exec:

$ pdsh -R exec -w host[0-10] bash -c 'ssh %h cat < <(echo test)'

Of course the drawback here is that you are creating the temporary file for redirection N times. Might be better to put your output into a local file and then just cat that file to each ssh command.

The benefit of pdsh/parallel over a for loop is that you get the parallelism.

В моих собственных тестах у меня были некоторые проблемы с работой именно этого примера:

root@master# pdsh -R exec -w host1 bash -c 'ssh %h cat < <(echo test)'
host1: bash: -c: line 0: syntax error near unexpected token `<'
host1: bash: -c: line 0: `ssh n1 cat < <(echo test)'
pdsh@master: host1: bash exited with exit code 1

Одна небольшая настройка делает его живым, и это использование «обычного» файла:

root@master# cat data.txt
test from file
root@master# pdsh -R exec -w host1 bash -c 'ssh %h cat < data.txt'
host1: test from file

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

1
27.01.2020, 23:22

Вам нужно заключить удаленную команду в кавычки, чтобы вся команда выполнялась на удаленном хосте (s ). например.

pdsh -a 'cat < <(echo test)'

Без кавычек только catвыполняется на удаленном хосте. Перенаправление(<)и процесс замены <(echo test)выполняются на локальном хосте.

Когда есть только один удаленный хост, использующий вывод echo test(, например. с командой ssh)это работает... но когда есть несколько удаленных хостов, желающих использовать этот вывод (, например. поскольку вы использовали pdshвместо ssh), это не сработает.

1
27.01.2020, 23:22

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

GNU Parallel --teeможет вам помочь:

seq 1000 |
  parallel --tee --pipe ssh {} wc ::: server1 server2

Замените seq 1000и wcсвоими командами.

В немодифицированной системе GNU/Linux это должно работать на 250 серверах. Если вам нужно больше, у вас закончатся дескрипторы файлов, и вам придется изменить ulimit -nили nofileв /etc/security/limits.confили /proc/sys/fs/file-max.

За кулисами запускается следующее (Это немного сложнее, потому что GNU Parallel собирает stdout и stderr из команд, но принцип тот же):

... | tee >(ssh server1 wc) >(ssh server2 wc) >/dev/null

Таким образом, производительность сравнима с tee. Но это также означает, что будет sshдля всех серверов параллельно -, а не только для нескольких одновременно.

1
27.01.2020, 23:22

Теги

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