Выполнение ifconfig
самостоятельно предоставляет только список интерфейсов, которые произошли, т.е. интерфейсы, которые так или иначе уже настроены.
Видеть все использование интерфейсов ifconfig -a
или ip address show
Быстрая проверка источника gzip (в частности, gzip 1.6, входящего в Ubuntu 14.04), показывает, что наблюдаемое поведение исходит от функции open_and_stat, начинающейся в строке 1037 gzip.c:
static int
open_and_stat (char *name, int flags, mode_t mode, struct stat *st)
{
int fd;
/* Refuse to follow symbolic links unless -c or -f. */
if (!to_stdout && !force)
{
if (HAVE_WORKING_O_NOFOLLOW)
flags |= O_NOFOLLOW;
else
{
#if HAVE_LSTAT || defined lstat
if (lstat (name, st) != 0)
return -1;
else if (S_ISLNK (st->st_mode))
{
errno = ELOOP;
return -1;
}
#endif
}
}
fd = OPEN (name, flags, mode);
if (0 <= fd && fstat (fd, st) != 0)
{
int e = errno;
close (fd);
errno = e;
return -1;
}
return fd;
}
Обратите внимание, что в строке комментария указано, что gzip не будет следовать за симлинками, если не будет вызвана с флагами -c или -f, а внутри #if ... #endif переменная errno установлена в ELOOP (слишком много встречающихся символических ссылок), если файл, который нужно сжать, на самом деле является сим-ссылкой.
Теперь, из man-страницы gzip(1), флаги -c и -f:
-c --stdout --to-stdout Записывайте на стандартный вывод; сохраняйте исходные файлы без изменений. Если есть несколько входных файлов, вывод состоит из последовательности независимых COM- членов, находящихся под давлением. Чтобы получить лучшее сжатие, сконцентрируйте все входные файлы. прежде чем сжимать их. -f - сила Принудительное сжатие или распаковка, даже если файл имеет несколько ссылок или соответствующий файл уже существует, или если сжатые данные считываются из или написанное на терминале. Если входные данные не в формате, распознаваемом gzip, и если также указана опция --stdout, скопируйте входные данные без изменения на стандартный выход: пусть zcat ведет себя как кошка. Если -f не дано, а когда нет. запущенный в фоновом режиме, gzip запрашивает подтверждение того, что существующий файл должны быть перезаписаны.
Собрав все вместе, вернемся к первоначальному вопросу:
$ ls -l total 4 -rw-rw-r-- 1 x86tux x86tux 13 Jun 16 13:10 realfile.txt lrwxrwxrwx 1 x86tux x86tux 12 Jun 16 23:40 symlink.txt -> realfile.txt $ gzip symlink.txt gzip: symlink.txt: Too many levels of symbolic links $ gzip -f symlink.txt $ ls -l total 8 -rw-rw-r-- 1 x86tux x86tux 13 Jun 16 13:10 realfile.txt -rw-rw-r-- 1 x86tux x86tux 45 Jun 16 13:10 symlink.txt.gz $ gunzip symlink.txt.gz $ ls -l total 8 -rw-rw-r-- 1 x86tux x86tux 13 Jun 16 13:10 realfile.txt -rw-rw-r-- 1 x86tux x86tux 13 Jun 16 13:10 symlink.txt $ md5sum * 618f486e0225d305d16d0648ed44b1eb realfile.txt 618f486e0225d305d16d0648ed44b1eb symlink.txt
Отдельный процесс для каждой части файла мог бы повредить кому-то, если бы была какая-либо возможность узкого места вашей операции, но при 10-11 гигабайтах очень трудно представить любой сценарий, в котором это вызов exec
для gzip
, который препятствует прогрессу.
В том же ключе, если бы это была куча небольших файлов, тогда gzip
, вероятно, не смог бы сжать их, имея меньше данных для сравнения на файл, но, опять же, на 10-11 гигабайт на операцию сжатия, что не будет проблемой.
Думаю, было бы интересно выяснить причину ошибки. Я бы посоветовал попытаться применить lsof
к фоновому gzip
pid и выяснить, что происходит.