はじめに (対象読者・この記事でわかること)

この記事は、Linux サーバーの運用・保守を担当するインフラエンジニアや、サーバー構築を学習中の学生・初学者を対象にしています。
記事を読むと、userdel コマンドでユーザを削除しようとした際に「userdel: user XXX is currently used by process YYY」というエラーが出て失敗する原因と、安全かつ確実にユーザを削除するための手順が身につきます。単にコマンドを打つだけでなく、プロセスやセッションとの関係を理解することで、トラブルを未然に防げるようになります。

前提知識

  • Linux 基本コマンド(ps, kill, who など)が使えること
  • 一般ユーザ・root ユーザの違いを理解していること
  • systemd または init によるサービス管理の基礎知識

なぜ「currently used by process」が表示されるのか

userdel は削除対象のユーザが何らかのプロセスやセッションを使用中だと判断すると、強制的に削除を中断し、「userdel: user XXX is currently used by process YYY」とメッセージを出力します。これは、システムの整合性を保護するための仕組みです。たとえば、対象ユーザでログイン中のシェル、稼働中のバッチジョブ、systemd サービス、スクリーン・tmux セッション、マウント済みのディレクトリなどが該当します。削除を強行すると、ファイルの所有権が「数字の UID」になり、バックアップや監査の際に判別が困難になるため、デフォルトでブロックされるのです。

具体的な手順:問題を特定し、安全にユーザを削除する

以下の手順で進めます。

ステップ1:削除対象のプロセス・セッションを洗い出す

  1. 対象ユーザでログイン中のターミナルを確認
    bash $ who | grep <username>
  2. 稼働中のプロセスを UID で検索
    bash $ ps -fu <username>
  3. systemd サービスや tmux/screen セッションが残っていないか確認
    bash $ systemctl --user -M <username>@ list-units --state=running $ tmux ls 2>/dev/null | grep <username>

ステップ2:プロセス・セッションを安全に終了させる

  1. 対話的ログインを強制ログアウト
    bash # 対象ユーザの tty を特定 $ who | grep <username> # シグナル送信 $ pkill -KILL -u <username>
  2. systemd ユーザサービスが残っている場合は停止・無効化
    bash $ sudo systemctl stop user@<uid>.service $ sudo systemctl disable user@<uid>.service
  3. tmux/screen は内部プロセスを終了後、セッションを削除
    bash $ sudo -u <username> tmux kill-server

ハマった点:プロセス番号が変わってもエラーが出続ける

プロセス ID(PID)が変動するサービスを kill しても、すぐに新しい PID が割り振られ、userdel が再び「currently used by process」と失敗することがあります。これは、ユーザが所有する systemd ユーザインスタンスが自動的に再起動されるためです。systemd の「lingering」設定が有効だと、ユーザログアウト後もサービスが残存しやすくなります。

解決策:lingering 無効化と killall の併用

  1. lingering を無効化
    bash $ sudo loginctl disable-linger <username>
  2. ユーザ所有の全プロセスを確実に終了
    bash $ sudo killall -u <username> -9
  3. マウントポイントが残っていればアンマウント
    bash $ find /run/user -uid $(id -u <username>) -exec umount -l {} \; 2>/dev/null
  4. 念のため再度プロセスを確認
    bash $ pgrep -u <username> || echo "プロセスなし"
  5. ユーザ削除
    bash $ sudo userdel -r <username>

まとめ

本記事では、userdel が「currently used by process」と失敗する仕組みと、プロセス・セッションを正しく終了させてから削除する手順を解説しました。

  • 削除前に who, ps, systemctl で稼働状況を調べる
  • systemd のユーザインスタンスや lingering 設定に注意
  • lingering を無効化→全プロセス終了→userdel 実行が最も確実

これらの手順を踏むことで、ファイル所有権が数値 UID で残ってしまう「オーファンなファイル」問題を回避でき、サーバー保守が安全に行えます。次回は、ユーザ一括削除スクリプトや Ansible での自動化手法について掘り下げていく予定です。

参考資料