Плавное завершение работы с зависанием задания в системном вызове

Плавное завершение работы с зависанием задания в системном вызове

Когда я вчера приостановил работу системы, задание не было завершено, и systemd-suspend.serviceс тех пор у меня висит задание в состоянии непрерывного сна:

# systemctl list-jobs
  JOB UNIT                    TYPE  STATE  
21595 post-resume.target      start waiting
21593 systemd-suspend.service start running
21592 suspend.target          start waiting
21596 post-resume.service     start waiting

# systemctl status systemd-suspend.service
● systemd-suspend.service - Suspend
   Loaded: loaded (/nix/store/2jspk70lir7jcn1krax8haw2j7486i3a-systemd-243.3/example/systemd/system/systemd-suspend.se>
   Active: activating (start) since Sat 2020-04-04 03:07:36 CEST; 23h ago
     Docs: man:systemd-suspend.service(8)
 Main PID: 16761 (systemd-sleep)
       IP: 0B in, 0B out
    Tasks: 1 (limit: 4915)
   Memory: 1.0M
      CPU: 20ms
   CGroup: /system.slice/systemd-suspend.service
           └─16761 /nix/store/2jspk70lir7jcn1krax8haw2j7486i3a-systemd-243.3/lib/systemd/systemd-sleep suspend

Apr 04 03:07:36 phlegethon systemd[1]: Starting Suspend...
Apr 04 03:07:36 phlegethon systemd-sleep[16761]: Suspending system...

# ps aux |grep suspend
root     16761  0.0  0.0  10364  2052 ?        Ds   Apr04   0:00 /nix/store/2jspk70lir7jcn1krax8haw2j7486i3a-systemd-243.3/lib/systemd/systemd-sleep suspend

При попытке вручную запустить режим ожидания ядро ​​(5.4.14) отвечает EBUSY:

# echo mem >/sys/power/state
-bash: echo: write error: Device or resource busy

Похоже, ядро ​​зависло при синхронизации одного из дисков:

# cat /proc/16761/stack
[<0>] iterate_bdevs+0x98/0x142
[<0>] ksys_sync+0x6e/0xb0
[<0>] ksys_sync_helper+0x13/0x90
[<0>] pm_suspend.cold.8+0x213/0x361
[<0>] state_store+0x80/0xe0
[<0>] kernfs_fop_write+0xc1/0x1a0
[<0>] vfs_write+0xa5/0x1a0
[<0>] ksys_write+0x59/0xd0
[<0>] do_syscall_64+0x4e/0x120
[<0>] entry_SYSCALL_64_after_hwframe+0x44/0xa9

Теперь в этом состоянии я даже не могу нормально выключить машину:

# systemctl poweroff
Failed to power off system via logind: There's already a shutdown or sleep operation in progress

Так что мне делать? Мне хочется потянуться за большой пушкой (Sysrq), но интересно, сработает ли она на самом деле? sync(1)Как и ожидалось, она просто зависает, поэтому я не хочу даже пробовать.

Также, есть ли способ узнатькоторыйдисковое устройство, которое ядро ​​ожидает? Я надеюсь, что это просто какое-то USB-устройство, ничего серьезного.

решение1

Я знаю, что это не совсем ответ на вопрос, но, возможно, это как-то поможет.
Вам или кому-то еще, кто это прочтет.

У меня была (или есть) похожая проблема сейчас. Suspend не завершился, вернувшись в систему с зависшей задачей.

24913 systemd-suspend.service start running
24912 suspend.target          start waiting

При попытке продолжить я получил то же самое сообщение, что и вы.

# systemctl suspend
Failed to suspend system via logind: There's already a shutdown or sleep operation in progress


Моя цель была приостановить, а не закрыть. Вот что я сделал.

# systemctl cancel
# systemctl stop systemd-suspend.service

Во-первых, чтобы остановить операцию зависания.
Во-вторых, заставил систему мгновенно приостановиться.

После отмены я попытался приостановить, systemctl suspendно в результате снова возникла та же проблема.
После пробуждения я запустил службу, которая снова приостановила работу системы.

Надеюсь, теперь я смогу приостановить работу без этого обходного пути.

решение2

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

У меня NetworkManager не запускался, не перезапускался и т. п. после входа в диспетчер отображения (без изменений по сравнению с настройками по умолчанию), поэтому у меня не было доступа к WiFi.

Я также видел эквивалент вышеупомянутого:

# systemctl list-jobs
  JOB UNIT                    TYPE  STATE  
21593 systemd-suspend.service start running

Использование этого метода systemctl cancel 21593остановило бы работу и позволило бы обойти проблему, что показало бы, что проблема действительно была.

Из man systemd-sleepнайденного

Непосредственно перед переходом системы в режим ожидания и/или гибернации systemd-suspend.service (и другие упомянутые модули соответственно) запускают все исполняемые файлы в /lib/systemd/system-sleep/... Все исполняемые файлы в этом каталоге выполняются параллельно, и выполнение действия не продолжается, пока все исполняемые файлы не будут завершены.

Итак, изучив, /lib/systemd/system-sleepя понял, что он содержит скрипты, tlpкоторые я недавно установил. Я удалил tlp и связанные с ним пакеты с помощью

sudo apt --purge remove tlp tlpui tlp-rdw

И проблема полностью исчезла.

Связанный контент