Ошибка в GNU Parallel заключается в том, что он начинает обработку только после чтения одного задания для каждого слота заданий. После этого он читает одно задание за раз.
В старых версиях вывод также будет задерживаться на количество слотов заданий. В более новых версиях вывод задерживается только на одно задание.
Таким образом, если вы отправляете одно задание в секунду на parallel -j10
, он будет считывать 10 заданий перед их запуском. В более старых версиях вам пришлось бы ждать еще 10 секунд, прежде чем вы увидите результат задания 3.
Обход ограничения при запуске состоит в том, чтобы подавать одно фиктивное задание на каждый слот задания в параллель:
true >jobqueue; tail -n+0 -f jobqueue | parallel &
seq $(parallel --number-of-threads) | parallel -N0 echo true >> jobqueue
# now add the real jobs to jobqueue
Обходной путь, который следует использовать для вывода --linebuffer
(, но при этом будут смешаны полные строки из разных заданий ).
Я могу придумать несколько причин. Вероятно, более распространенным является то, что что-то не так с петлевыми устройствами, например, уже используется слишком много петлевых устройств. Вы можете проверить, так ли это, настроив петлевое устройство вручную :
.# losetup --find --show file.iso
/dev/loop0
# mount -o ro /dev/loop0 mountpoint/
...
# losetup --detach /dev/loop0
Если первая команда не выводит допустимое устройство петли (/dev/loop*
), но выдает сообщение об ошибке, то проблема заключается в самой инфраструктуре устройств петли. Посмотрите, показывает ли losetup -a
какие-либо устройства. Может быть достигнуто максимальное количество. В этом случае вы можете попробовать создать больше с помощью опции модуля max_loop
(и перезагрузить )или вручную с помощью mknod
, как описано в этом ответе .
Тем не менее, есть еще один вариант, который кратко описан на mount
справочной странице системного вызова :
ENODEV filesystemtype not configured in the kernel.
Возможно, ваше ядро не поддерживает требуемую файловую систему. В приведенном выше примере с использованием образа компакт-диска это будет iso9660
. Попробуйте загрузить соответствующий модуль через
# modprobe iso9660
и повторите попытку. Если вы получаете modprobe: module iso9660 not found
, то вам не повезло, потому что ваше ядро вообще не поддерживает файловую систему и нет простого способа включить ее. Вы можете проверить поддерживаемые файловые системы, перечисленные в /proc/filesystems
. Чтобы это заработало, вы должны перекомпилировать ядро или, по крайней мере, соответствующий модуль (, соответствующий точной версии ядра, конечно ).
PS :Модуль называется isofs
в новых ядрах, но, по крайней мере, для modprobe
и его друзей существует псевдоним iso9660
.