Значит, это проблема с правами доступа. Файловая система FAT, смонтированная root, не может быть доступна обычным пользователям.
Это результат того, что FAT не содержит информации о правах собственности, поэтому все файлы считаются принадлежащими пользователю, который их смонтировал.[1] Сообщение об ошибке chown
вызвано тем, что вы пытаетесь скопировать файлы, принадлежащие вам, в файловую систему FAT, используя опцию -a
, которая сохраняет информацию о правах собственности. Но вы не можете сделать так, чтобы файлы принадлежали вашему пользователю, они должны принадлежать root.
Вы можете запустить (редактирование: вам также нужно добавить опцию rsync
с sudo too--no-owner
), или добавить -ouid=$USER
к команде mount.
Или вы можете использовать udisksctl
или udisks
для монтирования с помощью демона udisk, что и делает ваш графический интерфейс рабочего стола.[2]
Edit: I forgot udisks
looks slightly different to mount
, sorry. Я использую udisksctl mount -b /dev/...
Поэтому он явно не поддерживает синтаксис LABEL=. Вместо этого можно использовать символические ссылки (файлы, похожие на ярлыки), которые создает udev. udisksctl mount -b /dev/disk/by-label/SDcard
.
Udisks сам выберет точку монтирования; путь будет использовать идентификаторы файловой системы, такие как метка, так что пока они уникальны, путь будет последовательным... что, возможно, не идеально, хоум.
Я думаю, вы можете установить точку монтирования, которую будет использовать udisks
, вручную, создав запись в /etc/fstab
. GNOME Disks имеет графический интерфейс для этого (выберите диск, затем раздел, нажмите на шестеренку под ним, Edit mount options). Если вы хотите использовать "старую" команду mount
без sudo
, вы можете даже добавить "user" или "users" в список опций монтирования (см. man mount
и man fstab
о разнице между этими опциями и т.д.).
[1] Родные файловые системы Linux, такие как ext4, отличаются от FAT; файловая система записывает, какой идентификатор пользователя владеет каждым файлом, поэтому не имеет значения, кто монтирует ФС. Windows NTFS тоже поддерживает идентификаторы пользователей, но не спрашивайте меня, как она ведет себя, когда вы монтируете ее в Linux.
[2] Это, вероятно, будет иметь некоторые дополнительные ограничения политики (polkit): по умолчанию вы не сможете использовать udisks, если вы вошли на этот компьютер удаленно с помощью SSH.
Это действительно зависит от того, что вы подразумеваете под «безопасным». У вас есть два варианта убить процесс:
kill -9
)В большинстве случаев самый чистый и «безопасный» способ завершить процесс — вежливо попросить об этом с помощью SIGTERM. Это связано с тем, что по умолчанию программы распространяют SIGTERM на всех своих дочерних элементов и, таким образом, очищают все дерево процессов. Это также лучше, потому что у завершающихся процессов есть время, чтобы закрыть то, что они делали, чисто (очищая буферы и т. д. ).
Когда вы принудительно завершаете процесс, это не обязательно (или даже по умолчанию )уничтожает дочерние процессы. Имеет тенденцию оставлять сирот. Он также имеет тенденцию повреждать файлы и, как правило, вызывает небольшой беспорядок. Таким образом, очистка с принудительным уничтожением(kill -9
)не должна выполняться автоматически.
Сценарии Bash особенно сложно поддаются очистке. По умолчанию они будут распространять SIGTERM на свои дочерние процессы и ждать завершения своих дочерних процессов. Если по какой-то причине вы отправляете SIGTERM в сценарий bash, и он не завершается, то kill -9
почти наверняка оставит сирот.
Чтобы принудительно убить их, вам нужно принудительно убить скрипт и принудительно убить всех его дочерних элементов. Как правило, это беспорядочно и не рекомендуется в качестве автоматического действия.
К счастью, timeout
знает о проблеме дочерних процессов и стирает все дерево процессов, если его об этом просят.
timeout -s 9 20 myscript
Принудительно завершит все дочерние процессы.Имейте в виду, что это по-прежнему «грязный» способ закрытия команд, поскольку у них нет возможности правильно очистить себя и они могут повредить файлы.
Опция -s
команды timeout
позволяет указать сигнал, который будет отправлен по тайм-ауту.