Хотя @MarkSetchell абсолютно прав в своем комментарии, проблема с корнем здесь из-за man sed
лжи:
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
sed -i
не редактирует файлы на месте.
Чтоэто делает создание временного файла в том же каталоге, копирование входного файла во временный файл во время редактирования и, наконец, переименование временного файла в имя входного файла.Похоже на это:
sed '$ d' log > sedXxO11P
mv sedXxO11P log
Понятно, что исходный журнал и sedXxO11P имеют разные inode - назовем их ino1 и ino2.В GNU Parallel открыт ino1, и он действительно не знает о существовании ino2.GNU Parallel с радостью присоединится к ino1, совершенно не подозревая, что когда он закроет файл, файл исчезнет, потому что он уже не был связан.
Таким образом, вам нужно изменить содержимое файла, не изменяя индекс:
#!/usr/bin/bash
seq 10 | parallel -j1 -n0 --joblog log sleep 1 &
sleep 5
# Obvious race condition here:
# Anything appended to log before sed is done is lost.
# This can be avoided by suspending parallel while running this
tmp=$RANDOM$$
cp log $tmp
(rm $tmp; sed '$ d' >log) < $tmp
wait
cat log
Это работает прямо сейчас.Но не ожидайте, что это будет поддерживаемая функция - когда-либо.