Ubuntu ошибка записи в файл

Обновлено: 05.07.2024

Давно не писал про Ubuntu — не было повода, но недавно он появился. Мне не удалось скопировать на флешку файлы, о чем система радостно сообщала — «Файловая система доступна только для чтения».

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

Команду необходимо выполнить в терминале, вызвать который можно одновременным нажатием трёх клавиш — «Alt+Ctrl+T». Недоступность файловой системы была вызвана сбоем при копировании на флешку в прошлый раз. Возникли битые сектора, исправив которые, файловая система снова стала доступна для записи.

«sdb1» — идентификатор usb-накопителя в системе. Если у Вас два жестких диска, то он может отличаться от указанного. Выяснить его идентификатор можно командой:

Эта команда выведет список подключенных дисков.

Наверно идентификатор накопителя неправильный, точно sdd1, а не sdb1?

Подскажите как решить проблему, файл текстовый копирую на флешку, но скопировать не удается, появляется окно:

«Операция над файлами была завершена с ошибками.
Копирование файлов report.txt
В: /media/usb0… „

Файл не копируется.
Права доступа к файлу проверил, можно читать и писать r/w

Проблема явно в том, как Ubuntu работает с флешками (флешь исправна, проверено, все флешки так себя ведут на этой машине).

п.с. При подключении флешки к компьютеру, не появляется окно с предложение примонтировать флешь или открыть в файловом менеджере.
На другом компьютере при подключении флешь появляется окно.

Извиняй, но не подскажу — не сталкивался с таким. Если решишь проблему, отпиши как исправил.

Подскажите как получить информацию о флешке, а именно о правах доступа.
Файл с флешки можно скопировать на диск Ubuntu
Предполагаю проблема с правами.

Что из команд проверено:
sudo fdisk -l

множество сайтов облазил, но так ничего не понял.
та же ошибка но с самим телефоном.
было дело копировал сериальчик на внутреннюю память телефона (samsung galaxy s 2 i9100 телефончик рутированый, рутировал примерно года 1,5 назад-работал нормально без сбоев) во время копирования случайно выдернул usb шнур.
при повторном подключении ничего не заметил, с телефона все спокойно скидывается на пк а на тел с пк ни в какую. файлы на внутренней памяти и на флешке не возможно удалить через пк и менеджер файлов в телефоне, даже скриншоты не сохраняются. телефон перешел в режим только чтение.
помогите решить проблемку.

ps. root explorer только смог перемонтировать файловую систему для чтения и записи но только на момент удаления любого файла.

pss. вот я и подумал раз root explorer смог перемонтировать файловую систему и для чтения и для записи (хоть и временно) вот у меня и загорелась надежна что не все потеряно.
НАДЕЮСЬ ЧТО МНЕ ТУТ ПОМОГУТ.

Этот цикл(открытия,много записи, закрытия) повторяется 180 раз. И вроде когда инфы было меньше все работало. Но сейчас почему-то общий цикл на 60-м или около того разе обрывается, при этом пишется в файл какая-то хрень.

Вокруг еще файлы пишу но менее интенсивно, и там все Ок, и прога в целом работает правильно.

Вопрос. Где узнать как буфенизуется очередь записей и как может она переполниться, при этом не выдав никаких ошибок? Или в чем может быть проблема?

Данный просто не хотят писаться!

Заранее благодарен за любой совет.

А файл не превышает 2 гига? Если первышает, то будут проблемы. Надо юзать open с поддержкой больших файлов

Нет даже все файлы целиком не превышают. Но много вызовов fwrite(); И я не указал. Конкретно этот файл всегда дописывается (fd=fopen(fname,"a");.

вобщем когда-то столкнулся с подобной проблемой.

для начала попробуй fflush, но это не решение в этом случае, хотя может помочь.

посмотри нет ли работы с массивом типа char buf[SIZE_OF_BUF];

если есть - юзай вместо него malloc - тогда таких проблем точно не будет, по крайней мере у меня они ушли.

Массивов таких нет. И я использую new.


зачем мешаешь котлеты с мухами .. читай тред "C++" и пиши на C

Если что-то пишется, то откуда-то оно берется.
Либо проблемы непосредственно с записываемыми данными (вот тут
явно фрагмента программы не хватает, например, как описаны переменные, не передаются ли куда-либо "соседние" пременные по ссылки для вычислений и т.п., т.е. нет ли врага, который портит данные на проходе), либо какая-то подпрограмма явно шарашит по буферу.
Возможен: выход за пределы массива (ну нет массивов, так нет), некорректное использование создания/удаления объектов, как следствие возникновение висячих или дублированных ссылок и масса другого.
Кстати, что означает "цикл обрывается"? А точно ли для каждого файла выполняется fclose()? Не может ли оказаться, что одновременно открыто
масса файлов. В этом цикле ничего на ввод не открывается, закрываются ли входные файлы?
Обычно есть лимит на количество открытых одновременно файлов.

что произойдёт если слинковать прогу с efence и запустить?

Проблема в том что прога раньше, например в Окнах работала. При переходе в линукс увеличились объёмы данных. Цикл обрывается это значит, что в файле место под даный выделяются, Прочитать файл можно, но то что записывается это мусор. Откуда он берется не понятно. Ничего ещё раз повторяю не менялось, кроме объема данных. Но спасибо за ответы. Я попробую локализовать ошибку. И тогда напишу. Просто весь код приводить плохо, он огромный 1500 строк.

>что произойдёт если слинковать прогу с efence и запустить? Насколько я помню, либа валит процесс в сигментэшн не когда он залазит в чужую память, а когда пытается нарушить границы выделенного динамически массива внутри своей памяти.

вроде работает fwrite. правда странно? :)

static void Error(const char *s, int rc)
<
perror(s);
exit(rc);
>

int rc, i, cnt=100;
FILE *fp;
float tmp=3.14;

потом как-нибудь так:
gcc -Wall -ansi fwrite.c && time ./a.out && ls -l /tmp/out

real 0m19.099s
user 0m15.540s
sys 0m1.700s
-rw-r--r-- 1 ds ds 400000000 Mar 9 20:37 tmp/out

100 раз по 1е6 записей по 4 байта. 400метров. все сходится.
как видно никаких ошибок.

Исправление ошибки в работе с файлами

Причин возникновения проблем с доступом к файлам в Ubuntu может быть несколько.

Неисправность носителя

В первую очередь стоит проверить, точно ли исправна эта файловая система. В случае с флеш-картой сделать это легко. Попробуйте открыть её с компьютера на Windows. Другая система может быстро найти неполадки на накопителе. То же самое касается карт памяти, китайских плееров и других дешёвых носителей информации. Часто дело может быть в них.

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

Форматирование

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

С диском навряд ли у кого-то поднимется рука совершить такое. Форматирование может уничтожить много важной информации. Тем более, если повреждена файловая система Ubuntu, проблему надо искать в другом месте.

Форматирование диска

Проверка на наличие ошибок

Проверить диск на наличие ошибок можно не только на Windows. Убунту также обладает достаточным арсеналом для этого. Сделать это можно и с помощью команд, и пользуясь специальным приложением. Сначала разберём способ, использующий стандартные средства.

Просматриваем список накопителей:

Проверяем конкретный накопитель:

В примере взят sdf, но у вас название диска может отличаться.

Если том был примонтирован, то перед тем, как проверять, это действие нужно отменить:

Теперь проверяем том на бэдблоки — проблемные области:

Прогресс выполнения будет отображаться в процентах.

Теперь отмечаем бэдблоки, чтобы система перестала их использовать:

GParted

Загрузка приложения GParted

  1. Для начала эту программу необходимо установить. Сделать это легко при помощи команды:
    sudo apt-get install gparted
  2. Открываем GParted. Перед нами будут выведены все носители. Среди них должен быть и проблемный недоступный — если утилита увидит ошибки, то она пометит его восклицательным знаком.
  3. Теперь открываем наш диск и нажимаем на кнопку «Раздел», расположенную сверху.
  4. В выпавшем меню выбираем «Проверка на ошибки». Программа отсканирует диск и, возможно, найдёт неполадки, после чего файловая система станет доступной не только для чтения.

Права доступа

Наконец, последняя причина, по которой мы теряем доступ к управлению данными на носителях, заключается в нарушенных правах. С ней могут сталкиваться и опытные юзеры, использующие root-режим. Когда мы используем различные команды, не до конца понимая их суть, или запускаем программы с расширенными полномочиями, система может по ошибке перекрыть доступ.

Проверка прав доступа

В качестве универсального метода здесь подойдёт команда:

Вместо [user] необходимо вписать имя пользователя. Команда chown отвечает за смену прав доступа к папке. Атрибут –R означает, что этот раздел пользователь может только читать. Sudo отменяет эти изменения. В примере проблема заключалась в домашнем разделе, если у вас проблемы с флешкой, то следует вписать её директорию.

Файловая система Убунту работает немного по другим принципам, нежели на Windows. Поэтому любые диски под её управлением ведут себя по-другому. Из-за этого возникают и новые ошибки, с которыми на Винде нельзя столкнуться.

$ programma 2>> programma.errors [Enter]

В этой статье мы рассмотрим как выполняется перенаправление потоков ввода вывода в Linux, какие операторы для этого используются, а также где все это можно применять.

Как работает перенаправление ввода вывода

Все команды, которые мы выполняем, возвращают нам три вида данных:

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

top -bn 5 > top.log

Linux вывод ошибок в файл

Linux вывод ошибок в файл

top -bn 5 >> top.log

По умолчанию для перенаправления используется дескриптор файла стандартного вывода. Но вы можете указать это явно. Эта команда даст тот же результат:

top -bn 5 1>top.log

Linux вывод ошибок в файл

ls -l /root/ 2> ls-error.log
$ cat ls-error.log

Linux вывод ошибок в файл

Чтобы добавить данные в конец файла используйте тот же символ:

ls -l /root/ 2>>ls-error.log

Linux вывод ошибок в файл

ls -l /root/ >ls-error.log 2>&1

Linux вывод ошибок в файл

Сначала будет отправлен вывод команды ls в файл ls-error.log c помощью первого символа перенаправления. Дальше в тот же самый файл будут направлены все ошибки. Второй метод проще:

ls -l /root/ &> ls-error.log

Также можно использовать добавление вместо перезаписи:

ls -l /root/ &>> ls-error.log

Стандартный ввод из файла

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

Linux вывод ошибок в файл

Linux вывод ошибок в файл

Таким образом, мы в одной команде перенаправляем ввод вывод linux.

Использование тоннелей

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

ls -lt | head -n 5

С помощью утилиты xargs вы можете комбинировать команды таким образом, чтобы стандартный ввод передавался в параметры. Например, скопируем один файл в несколько папок:

echo test/ tmp/ | xargs -n 1 cp -v testfile.sh

Linux вывод ошибок в файл

echo "Тест работы tee" | tee file1

Linux вывод ошибок в файл

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

Выводы

Linux вывод ошибок в файл

Стандартные потоки ввода и вывода в Linux являются одним из наиболее распространенных средств для обмена информацией процессов, а перенаправление >, >> и | является одной из самых популярных конструкций командного интерпретатора.

В данной статье мы ознакомимся с возможностями перенаправления потоков ввода/вывода, используемых при работе файлами и командами.

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

Стандартный вывод и стандартная ошибка отображаются на дисплее терминала пользователя в виде текста.

Ввод и вывод распределяется между тремя стандартными потоками:

Потоки также пронумерованы:

Из стандартного ввода команда может только считывать данные, а два других потока могут использоваться только для записи. Данные выводятся на экран и считываются с клавиатуры, так как стандартные потоки по умолчанию ассоциированы с терминалом пользователя. Потоки можно подключать к чему угодно: к файлам, программам и даже устройствам. В командном интерпретаторе bash такая операция называется перенаправлением:

Стандартный ввод

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

EOF вводится нажатием сочетания клавиш Ctrl+D.

Рассмотрим работу со стандартным выводом на примере команды cat (от CONCATENATE, в переводе “связать” или “объединить что-то”).

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

Cat отправляет полученные входные данные на дисплей терминала в качестве стандартного вывода и останавливается после того как получает EOF.

Пример

Введите команду cat без аргументов:

В открывшейся строке введите, например, “1” и нажмите клавишу Enter. На дисплей выводится “1”. Введите “a” и нажмите клавишу Enter. На дисплей выводится “a”.

Дисплей терминала выглядит следующим образом:

Для завершения ввода данных следует нажать сочетание клавиш Ctrl + D.

Стандартный вывод

Стандартный вывод записывает данные, сгенерированные программой. Когда стандартный выходной поток не перенаправляется в какой-либо файл, он выводит текст на дисплей терминала.

При использовании без каких-либо дополнительных опций, команда echo выводит на экран любой аргумент, который передается ему в командной строке:

Аргументом является то, что получено программой, в результате на дисплей терминала будет выведено:

При выполнении echo без каких-либо аргументов, возвращается пустая строка.

Пример

Команда объединяет три файла: file1, file2 и file3 в один файл bigfile:

Команда cat по очереди выводит содержимое файлов, перечисленных в качестве параметров на стандартный поток вывода. Стандартный поток вывода перенаправлен в файл bigfile.

Стандартная ошибка

Стандартная ошибка записывает ошибки, возникающие в ходе исполнения программы. Как и в случае стандартного вывода, по умолчанию этот поток выводится на терминал дисплея.

Пример

Рассмотрим пример стандартной ошибки с помощью команды ls, которая выводит список содержимого каталогов.

При запуске без аргументов ls выводит содержимое в пределах текущего каталога.

Введем команду ls с каталогом % в качестве аргумента:

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

Linux включает в себя команды перенаправления для каждого потока.

Пример

В приведенном примере команда cat используется для записи в файл file1, который создается в результате цикла:

Для завершения цикла нажмите сочетание клавиш Ctrl + D.

Если файла file1 не существует, то в текущем каталоге создается новый файл с таким именем.

Для просмотра содержимого файла file1 введите команду:

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

Для перезаписи содержимого файла введите следующее:

Для завершения цикла нажмите сочетание клавиш Ctrl + D.

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

Предыдущего текста в текущем файле больше не существует, так как содержимое файла было переписано командой >.

Для добавления нового текста к уже существующему в файле с помощью двойных скобок >> выполните команду:

Для завершения цикла нажмите сочетание клавиш Ctrl + D.

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

Каналы

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

Пример

В результате каждый файл текущего каталога будет размещен на новой строке:

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

Пример

Для сохранения имен файлов, содержащих строку «LOG», используется следующая команда:

Вывод команды dir отсылается в команду-фильтр find. Имена файлов, содержащие строку «LOG», хранятся в файле loglist в виде списка (например, Config.log, Logdat.svd и Mylog.bat).

При использовании нескольких фильтров в одной команде рекомендуется разделять их с помощью знака канала |.

Фильтры

Фильтры представляют собой стандартные команды Linux, которые могут быть использованы без каналов:

Как правило, все нижеприведенные команды работают как фильтры, если у них нет аргументов (опции могут быть):

Если в качестве аргумента передаётся файл, команда-фильтр считывает данные из этого файла, а не со стандартного потока ввода (есть исключения, например, команда tr, обрабатывающая данные, поступающие исключительно через стандартный поток ввода).

Пример

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

Пример

Допускается перенаправление нескольких потоков в один файл:

Для просмотра содержимого файла file3 введите команду cat:

В результате на дисплее терминала отобразиться следующее:

Мы рассмотрели возможности работы с перенаправлениями потоков >, >> и |, использование которых позволяет лучше работать с bash скриптами.

Читайте также: