Вопрос или проблема
Я запустил операцию форматирования на диске, попросив приложение Диски перезаписать все содержимое на диске. Этот процесс занимает слишком много времени. Как мне остановить процесс? Закрытие приложения Диски не остановило операцию записи.
gnome-disks
обращается к демону UDisks2
, когда он форматирует диск. Хотя gnome-disks
не остановит форматирование, UDisks может это сделать. Вам нужно взаимодействовать с ним через интерфейс dbus
, используя gdbus
.
Сначала вам нужно вызвать gdbus introspect
, чтобы найти задачу, которая форматирует данный диск. Команда ниже обращается к системному dbus для подключения к демону UDisks2 (флаг –dest). Она просит этот демон рекурсивно просмотреть все его Задачи (флаг –object-path).
gdbus introspect --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2/jobs --recurse
Это вернет нечто, похожее на следующее (за исключением тех мест, где я вставил многоточия, чтобы вырезать ненужный текст).
node /org/freedesktop/UDisks2/jobs {
node /org/freedesktop/UDisks2/jobs/20 {
interface org.freedesktop.DBus.Properties {
methods:
Get(in s interface_name,
in s property_name,
out v value);
GetAll(in s interface_name,
out a{sv} properties);
Set(in s interface_name,
in s property_name,
in v value);
signals:
PropertiesChanged(s interface_name,
a{sv} changed_properties,
as invalidated_properties);
properties:
};
[...]
[...]
interface org.freedesktop.UDisks2.Job {
methods:
Cancel(in a{sv} options);
signals:
Completed(b success,
s message);
properties:
readonly s Operation = 'format-erase';
readonly d Progress = 0.06491025108100755;
readonly b ProgressValid = true;
readonly t Bytes = 2000379969536;
readonly t Rate = 8902066;
readonly t StartTime = 1733774080719017;
readonly t ExpectedEndTime = 1733997306601043;
readonly ao Objects = ['/org/freedesktop/UDisks2/block_devices/sdb2'];
readonly u StartedByUID = 1000;
readonly b Cancelable = true;
};
};
};
Строки, которые имеют значение для вас, следующие:
- Сначала мы смотрим на ID объектов. Эта строка — путь к одному объекту задачи #20.
node /org/freedesktop/UDisks2/jobs/20 {
- Следующим шагом мы смотрим на свойства задачи, чтобы определить, является ли это той задачей, которую мы хотим.
...
interface org.freedesktop.UDisks2.Job {
...
properties:
readonly s Operation = 'format-erase';
...
readonly ao Objects = ['/org/freedesktop/UDisks2/block_devices/sdb2'];
...
readonly b Cancelable = true;
«Интерфейс» для задачи, идентифицированной как задача #20, имеет свойства, которые показывают, что она выполняет операцию ‘format-erase’ на блоковом устройстве sdb2 (которое является диском, который я отформатировал для этого примера). Важно, что мы видим, что это отменяемая задача!
- Теперь, когда мы знаем, что она отменяемая, мы хотим снова взглянуть на тот же интерфейс Job и найти метод Cancel.
...
interface org.freedesktop.UDisks2.Job {
methods:
Cancel(in a{sv} options);
...
- Теперь мы готовы фактически выполнить команду отмены.
Теперь мы знаем номер ID задачи (20
в моем случае) и имя метода Cancel, который мы хотим вызвать. Итак, давайте отменим эту задачу. Примечание: Документация для метода Cancel говорит, что a{sv}
параметры для этого метода в настоящее время не используются, поэтому мы оставим их пустыми, поставив {}
вместо них в команде.
gdbus call --system \
--dest org.freedesktop.UDisks2 \
--object-path /org/freedesktop/UDisks2/jobs/20 \
--method org.freedesktop.UDisks2.Job.Cancel \
{}
Если вы все сделали правильно, вы должны быть в состоянии выполнить первую команду gdbus introspect
в этом посте, чтобы получить список задач, не содержащий отменённую задачу format-erase
. В моем случае она просто вернула пустой список задач, потому что не было других запущенных задач UDisks2.
node /org/freedesktop/UDisks2/jobs {
};
.
Ответ или решение
Как остановить операцию форматирования, запущенную через приложение Disks
Если вы запустили операцию форматирования диска с помощью приложения Disks и процесс затянулся, существуют способы прервать эту операцию, даже если простое закрытие приложения не отменяет ее. Давайте разберем, как можно выполнить данную задачу, используя интерфейс D-Bus.
Шаг 1: Понимание работы приложения Disks и UDisks2
Приложение gnome-disks использует демона UDisks2 для выполнения операций над дисками, включая форматирование. Когда вы инициируете процесс форматирования, gnome-disks отправляет запрос этому демону, который выполняет задачу в фоновом режиме. Закрытие интерфейса самой утилиты не останавливает операции, поэтому необходимо работать с демоном напрямую через команду gdbus
.
Шаг 2: Поиск формирующегося задания
Чтобы найти активное задание форматирования, используйте команду gdbus introspect. Эта команда позволит вам просмотреть все выполняемые задания. Используйте следующую команду:
gdbus introspect --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2/jobs --recurse
Эта команда подключается к системной шине D-Bus и извлекает информацию о всех текущих заданиях демона UDisks2.
Шаг 3: Анализ возвращаемого вывода
После выполнения команды вам будет выдана информация о текущих задачах. Вы должны найти задание, связанное с операцией форматирования. Важные свойства, на которые следует обратить внимание:
- Operation: показывает выполняемую операцию (например,
format-erase
). - Objects: определяет, на каком диске выполняется операция (например,
/org/freedesktop/UDisks2/block_devices/sdb2
). - Cancelable: показывает, можно ли отменить это задание (должно быть
true
).
Пример вывода, который вам может быть предоставлен:
interface org.freedesktop.UDisks2.Job {
...
properties:
readonly s Operation = 'format-erase';
readonly ao Objects = ['/org/freedesktop/UDisks2/block_devices/sdb2'];
readonly b Cancelable = true;
...
};
Шаг 4: Отмена задания
Если вы нашли нужное задание и убедились, что оно может быть отменено, следующей задачей будет вызов метода Cancel для этого задания. Запомните ID задания (например, /org/freedesktop/UDisks2/jobs/20
). После этого выполните следующую команду:
gdbus call --system \
--dest org.freedesktop.UDisks2 \
--object-path /org/freedesktop/UDisks2/jobs/20 \
--method org.freedesktop.UDisks2.Job.Cancel \
{}
Этот вызов отменит задание форматирования. После выполнения команды вы можете снова использовать gdbus introspect
, чтобы убедиться, что задание действительно было отменено (например, список заданий будет пустым).
Заключение
Знание того, как эффективно управлять процессами форматирования с помощью gnome-disks и UDisks2, — важный навык для любого IT-специалиста. Следуя указанным шагам, вы сможете отменить процессы, которые по каким-либо причинам затягиваются, и более эффективно управлять дисковыми ресурсами в вашей системе.