Файлы искажения символьной ссылки в подкаталогах, не изменяя текущий каталог

Попробуйте это:

mkfifo для каждого процесса.

Затем зависните tail -f | myjob на каждом FIFO.

Например, настраивая рабочих (myjob процессы)

mkdir /tmp/jobs
for X in 1 2 3 4
do
   mkfifo pipe$X
   tail -f pipe$X | myjob &
   jobs -l| awk '/pipe'$X'/ {print $2, "'pipe$X'"}' >> pipe-job-mapping
done

В зависимости от Вашего приложения (myjob) Вы мог бы eb способный использовать задания-s для нахождения остановленных заданий. Иначе перечислите процессы, отсортированные по ЦП, и выберите одно потребление наименьшее количество ресурсов. Из имеют сам отчет о задании, например, путем установки флага в файловой системе, когда требуется больше работы.

Принятие остановок задания при ожидании входа, использовать

jobs -sl узнать pid остановленного задания и поручить ему работу, например

grep "^$STOPPED_PID" pipe-to-job-mapping | while read PID PIPE
do
   cat workset > $PIPE
done

Я протестировал это с

garfield:~$ cd /tmp
garfield:/tmp$ mkfifo f1
garfield:/tmp$ mkfifo f2
garfield:/tmp$ tail -f f1 | sed 's/^/1 /' &
[1] 21056
garfield:/tmp$ tail -f f2 | sed 's/^/2 /' &
[2] 21058
garfield:/tmp$ echo hello > f1
1 hello
garfield:/tmp$ echo what > f2
2 what
garfield:/tmp$ echo yes > f1
1 yes

Это, которое я должен допустить, было просто придумано так ymmv.

10
30.12.2014, 01:11
4 ответа

Можно дефрагментировать данные, хранящиеся в файловой системе (файлы, структуры файловой системы, метаданные и т.д.), свободное пространство или и то, и другое.

Вероятно, когда кто-то говорит «дефрагмент», он имеет в виду данные (ваше первое определение). Традиционно при дефрагментации свободного пространства оно ставится в конец (ваше второе определение). Обычно вы делаете это только во время подготовки к сокращению раздела, но вы также можете сделать это, например, чтобы разрешить большое непрерывное распределение (скажем, вы собираетесь редактировать некоторые видео). Но на самом деле, за исключением сокращения раздела, дефрагментация свободного пространства не часто требуется.

Усадка перегородки, как правило, возможна только на одном из концов (большинство, если не все, форматов перегородки [1] не позволяют вырезать отверстие посередине). Обычно структуры данных файловой системы занимают начало раздела, поэтому сокращение (и увеличение) обычно выполняется в конце. Независимо от того, какой инструмент вы используете для этого (диспетчер дисков Windows, gparted и т.д.), на конце должно быть достаточно свободного места, и это часто требует перемещения данных. И Windows, и gparted сделают это.

Требует ли FS дефрагментации, зависит от многих вещей, по крайней мере:

  • Для чего она используется. Случайные редко используемые документы могут допускать безграничную фрагментацию; Приложения видеорегистратора pushing-the-limits не могут допускать никаких. Некоторые вещи на самом деле более терпимы к фрагментации, чем вы думаете, например, базы данных (потому что они обычно делают случайное чтение/запись, а не последовательное).
  • Какой это тип диска. Поиски на твердотельных накопителях практически бесплатны, поэтому фрагментация намного дешевле.
  • Объем памяти, доступной для дискового кэша. Не имеет значения, насколько он фрагментирован на диске, если все его данные считываются и все они удовлетворяются из кэша. Или, если все записи могут быть буферизованы достаточно долго, чтобы отправить их на диск по порядку.
  • ОС, главным образом из-за различий кэширования.
  • Файловая система. Некоторые имеют много накладных расходов для очень фрагментированных файлов.

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


1: Хотя часто это делают логические дисковые менеджеры. Например, при использовании разреженного распределения его типичная попытка освободить достаточно большие блоки неиспользуемого пространства. Заметьте, что они притворяются файловой системе, что пространство не было восстановлено (и отдают его обратно, когда файловая система хочет записать туда).

-121--128952-

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

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

Прежде всего, необходимо использовать исходную маршрутизацию. Некоторые примеры приведены в запросе на использование функций, который должен быть выполнен при создании конфигурации маршрутизации на основе источника . Во-вторых, трудно добраться до компьютера извне, если он имеет частные сетевые адреса, скрытые за маскирующим (NAT) маршрутизатором. MPTCP хорошо работает на устройствах, подключенных к Интернету, а не на устройствах, подключенных к частным сетям с ограниченным подключением через маскирующий маршрутизатор.

Если вы хотите просто поэкспериментировать, вам, возможно, будет легче использовать только одно соединение для достижения конечной точки с поддержкой MPTCP через два различных маршрута. Но если вы хотите использовать два различных соединения на вашей стороне, вам, вероятно, придется сначала получить две реальные ссылки на Интернет с одним общедоступным IPv4 или IPv6 адресом.

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

-121--145989-

Но что-то в синтаксисе вызывает недоумение и противоречит ожиданиям.

Аргументами для ln в том виде, в котором вы его используете, являются:

ln [OPTION]... [-T] TARGET LINK_NAME (1-я форма)

Недоумение заключается в том, что при создании symlink аргумент target для ln должен быть не путем к файлу, а скорее содержимым создаваемой symlink. Если подумать на мгновение, то очевидно, что это должен быть именно путь. Рассмотрим:

$ echo foo >foo
$ ln -s foo bar1
$ ln -s $PWD/foo bar2
$ cat bar1
foo
$ cat bar2
foo
$ ls -l bar1 bar2
lrwxrwxrwx 1 matt matt  3 Dec 29 16:29 bar1 -> foo
lrwxrwxrwx 1 matt matt 29 Dec 29 16:29 bar2 -> /home/matt/testdir/foo

В этом примере я создаю 2 символьные ссылки с именами «bar1» и «bar2», которые указывают на один и тот же файл. ls показывает, что сами symlinks имеют различное содержимое, хотя - один содержит абсолютный путь, а другой - относительный путь. Из-за этого один будет продолжать работу, даже если он будет перемещен в другой каталог, а другой не будет:

$ mv bar2 /tmp
$ cat /tmp/bar2
foo
$ mv bar1 /tmp
$ cat /tmp/bar1
cat: /tmp/bar1: No such file or directory

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

Если вы хотите создать файл с именем deploy/resources.php, который ссылается на deploy/resources.build.php, вам нужно решить, хотите ли вы создать абсолютную symlink (которая устойчива к перемещаемому symlink, но разрывается при перемещении целевого объекта) или относительную symlink (который будет продолжать работать до тех пор, пока symlink и target перемещаются вместе и поддерживают одинаковые относительные пути).

Чтобы создать абсолютную символьную ссылку, можно сделать следующее:

$ ln -s $PWD/deploy/resources.build.php deploy/resources.php

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

$ ln -s resources.build.php deploy/resources.php

Если бы они не находились в одном каталоге, вместо этого нужно было бы сделать что-то вроде:

$ ln -s ../foo/f bar/b

В этом случае, несмотря на то, что foo и bar находятся в текущем каталоге, необходимо включить ../ в ln target , поскольку в нем описывается, как найти f из каталога, содержащего b .

Это чрезвычайно длинное объяснение, но, надеюсь, оно поможет вам понять синтаксис ln немного лучше.

9
27.01.2020, 20:01

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

  (cd deploy && ln -s resources.build.php resources.php && cat resources.php)

Когда подчинки заканчиваются выполнением, вы найдете себя еще в правильном каталоге.

В качестве альтернативы вы можете попробовать

 ln -s resources.build.php deploy/resources.php

, которые также работают, пренебрегая включать в CL то, что файл Resources.build.php не находится в каталоге, где вы выпускаете команду, но на самом деле внутри ./ Развертывание .

3
27.01.2020, 20:01

Это сбивало меня с толку, пока я не понял, что символическая ссылка — это, по сути, файл конфигурации. то есть как бы я записал эти данные пути в простой текстовый файл:

ln -s [target] [link name]

становится:

echo [target] > [link name]

Ошибка, которую я (и, вероятно, OP )совершали, заключалась в том, что они думали, что ln нужно знать о файле, на который он нацелен. ln все равно. Это просто запись некоторой информации о пути в файл. Это вполне разумная ln команда:

ln -s /path/doesnt/exist/file.err
ll
file.err -> /path/doesnt/exist/file.err

Отсюда:

ln -s deploy/resources.build.php deploy/resources.php

создает файл simlink с именем resources.phpв папке ./deploy, который ссылается на файл resources.build.phpв папке ./deploy/deploy/.

Это вряд ли то, что вам нужно, и дает плохую (неработающую )ссылку. В ссылке нет ничего плохого, если вы поместите туда этот файл, то ссылка будет работать. Однако, (, как указывали другие ), я и ОП хотели:

ln -s resources.build.php deploy/resources.php
1
27.01.2020, 20:01

Недавно я столкнулся с этой проблемой. Имейте в виду, что source— это своего рода путь дескриптора для target.

❯ ln -s source target

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

Пример :Связывание источника aс целью b.

root
  ├── foo
  │    └── a
  └── bar
❯ pwd
root
❯ ln -s../foo/a./bar/b

В этом примере описание файла b../foo/a. Итак, поскольку я файл b, я должен:

  1. Перейти на один каталог вверх от bar.
  2. Измените на foo.
  3. Найти a.
root
  ├── foo
  │    └── a
  └── bar
       └── b ->../foo/a
0
01.09.2020, 05:35

Теги

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