はじめに (対象読者・この記事でわかること)
この記事は、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:削除対象のプロセス・セッションを洗い出す
- 対象ユーザでログイン中のターミナルを確認
bash $ who | grep <username> - 稼働中のプロセスを UID で検索
bash $ ps -fu <username> - systemd サービスや tmux/screen セッションが残っていないか確認
bash $ systemctl --user -M <username>@ list-units --state=running $ tmux ls 2>/dev/null | grep <username>
ステップ2:プロセス・セッションを安全に終了させる
- 対話的ログインを強制ログアウト
bash # 対象ユーザの tty を特定 $ who | grep <username> # シグナル送信 $ pkill -KILL -u <username> - systemd ユーザサービスが残っている場合は停止・無効化
bash $ sudo systemctl stop user@<uid>.service $ sudo systemctl disable user@<uid>.service - tmux/screen は内部プロセスを終了後、セッションを削除
bash $ sudo -u <username> tmux kill-server
ハマった点:プロセス番号が変わってもエラーが出続ける
プロセス ID(PID)が変動するサービスを kill しても、すぐに新しい PID が割り振られ、userdel が再び「currently used by process」と失敗することがあります。これは、ユーザが所有する systemd ユーザインスタンスが自動的に再起動されるためです。systemd の「lingering」設定が有効だと、ユーザログアウト後もサービスが残存しやすくなります。
解決策:lingering 無効化と killall の併用
- lingering を無効化
bash $ sudo loginctl disable-linger <username> - ユーザ所有の全プロセスを確実に終了
bash $ sudo killall -u <username> -9 - マウントポイントが残っていればアンマウント
bash $ find /run/user -uid $(id -u <username>) -exec umount -l {} \; 2>/dev/null - 念のため再度プロセスを確認
bash $ pgrep -u <username> || echo "プロセスなし" - ユーザ削除
bash $ sudo userdel -r <username>
まとめ
本記事では、userdel が「currently used by process」と失敗する仕組みと、プロセス・セッションを正しく終了させてから削除する手順を解説しました。
- 削除前に
who,ps,systemctlで稼働状況を調べる - systemd のユーザインスタンスや lingering 設定に注意
- lingering を無効化→全プロセス終了→userdel 実行が最も確実
これらの手順を踏むことで、ファイル所有権が数値 UID で残ってしまう「オーファンなファイル」問題を回避でき、サーバー保守が安全に行えます。次回は、ユーザ一括削除スクリプトや Ansible での自動化手法について掘り下げていく予定です。
参考資料
- man userdel, systemd, loginctl
- Red Hat 公式 – Removing Users
- Debian Wiki – DeleteUser
