ユーザー アカウントを追加しようとしましたが、useradd: cannot lock /etc/passwd; が表示されます。後でもう一度やり直してください どうすればいいですか 私はこのコードを書きました
echo -n "Enter a number of user account "
read n
for((i=1;i<n;i++));
useradd CPE_User$i
done
ユーザー アカウントを追加しようとしましたが、useradd: cannot lock /etc/passwd; が表示されます。後でもう一度やり直してください どうすればいいですか 私はこのコードを書きました
echo -n "Enter a number of user account "
read n
for((i=1;i<n;i++));
useradd CPE_User$i
done
useradd
このスクリプトは何回もすばやく呼び出されることを除けば、何も問題はありません。前のuseradd
インスタンス (ロックを保持している間/etc/passwd
) によって開始されたものが引き続き実行されている場合、新しいインスタンスは失敗します。
そのエラーに明確な終了ステータスがあるかどうかを確認してください。その場合は、それを検出して再試行できます。
たとえば、その終了ステータスが次の場合5
:
useradd "CPE_User$i"; status=$?
case $status in
0) break ;;
5) echo "waiting to retry after exit status $status..." >&2
sleep 1
continue
;;
*) echo "unexpected exit status $status" >&2
exit ;;
esac
useradd
は OS によって提供され、標準化されたツールではないため、その使用法と終了ステータスの動作はプラットフォームによって異なります。をチェックすることで、終了ステータスを判断できます$?
。
試すことができる別のアプローチ (ループのたびに問題が発生する場合) は、独自のロックを行うことです。
for ((i=1; i<n; i++)); do
{
flock -x 200
useradd CPU_User"$i"
} 200>/tmp/passwd.lock
done
他の何かがを個別に lock している場合、これは役に立ちませんが/etc/passwd
、何かが のロックを継承している場合は問題を解決できる可能性がありuseradd
ます (これは、あなたのロックも継承するためです)。
私は同じ問題を抱えていて、以下の操作を試みましたが、うまくいきませんでした
rm -rf /etc/*.lock
後で、隠しロックファイルもリストする以下のコマンドを見つけました。
find /etc | grep -iE '.lo?ck$'
/etc/selinux/targeted/semanage.read.LOCK
/etc/selinux/targeted/semanage.trans.LOCK
/etc/selinux/targeted/active/modules/100/clock
/etc/selinux/targeted/active/modules/100/sanlock
/etc/selinux/targeted/active/modules/100/vlock
/etc/pam.d/vlock
/etc/.pwd.lock
出力で、犯人ファイルを取得し、この問題を削除した後、解決しました
rm -rvf /etc/.pwd.lock