0

ユーザー アカウントを追加しようとしましたが、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
4

2 に答える 2

1

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ます (これは、あなたのロックも継承するためです)。

于 2013-10-10T12:38:00.873 に答える
0

私は同じ問題を抱えていて、以下の操作を試みましたが、うまくいきませんでした

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
于 2020-09-04T06:26:17.153 に答える