Как отключить программу с потенциально бесконечным циклом

Значит, это проблема с правами доступа. Файловая система 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.

0
11.03.2019, 13:50
2 ответа

Это действительно зависит от того, что вы подразумеваете под «безопасным». У вас есть два варианта убить процесс:

  • Вежливо попросить процесс завершиться (, например, с помощью SIGTERM)
  • В -вежливо потребовать от ядра принудительно убить его (Например,:kill -9)

В большинстве случаев самый чистый и «безопасный» способ завершить процесс — вежливо попросить об этом с помощью SIGTERM. Это связано с тем, что по умолчанию программы распространяют SIGTERM на всех своих дочерних элементов и, таким образом, очищают все дерево процессов. Это также лучше, потому что у завершающихся процессов есть время, чтобы закрыть то, что они делали, чисто (очищая буферы и т. д. ).

Когда вы принудительно завершаете процесс, это не обязательно (или даже по умолчанию )уничтожает дочерние процессы. Имеет тенденцию оставлять сирот. Он также имеет тенденцию повреждать файлы и, как правило, вызывает небольшой беспорядок. Таким образом, очистка с принудительным уничтожением(kill -9)не должна выполняться автоматически.


Сценарии Bash особенно сложно поддаются очистке. По умолчанию они будут распространять SIGTERM на свои дочерние процессы и ждать завершения своих дочерних процессов. Если по какой-то причине вы отправляете SIGTERM в сценарий bash, и он не завершается, то kill -9почти наверняка оставит сирот.

Чтобы принудительно убить их, вам нужно принудительно убить скрипт и принудительно убить всех его дочерних элементов. Как правило, это беспорядочно и не рекомендуется в качестве автоматического действия.

К счастью, timeoutзнает о проблеме дочерних процессов и стирает все дерево процессов, если его об этом просят.

timeout -s 9 20 myscript

Принудительно завершит все дочерние процессы.Имейте в виду, что это по-прежнему «грязный» способ закрытия команд, поскольку у них нет возможности правильно очистить себя и они могут повредить файлы.

2
28.01.2020, 02:40

Опция -sкоманды timeoutпозволяет указать сигнал, который будет отправлен по тайм-ауту.

0
28.01.2020, 02:40

Теги

Похожие вопросы