システムコールで一時停止ジョブがハングしている正常なシャットダウン

システムコールで一時停止ジョブがハングしている正常なシャットダウン

昨日システムを一時停止したとき、ジョブは終了せず、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

カーネルがディスクの 1 つを同期している途中で停止しているようです:

# 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

これは質問に対する正確な答えではないことは承知していますが、多少は役に立つかもしれません。
あなたやこれを読む他の誰かのために。

私も現在、同様の問題を抱えています (またはまだ抱えています)。ジョブがハングしたまま、サスペンドがシステムへの復帰を完了しませんでした。

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

私も同様の問題に遭遇しました。私の場合は、根本的な原因を見つけるのに 1 日以上かかりました。幸い、これは 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

そして問題は完全に解決しました。

関連情報