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由您的操作系统提供,并且不是标准化工具,因此其使用和退出状态行为会因平台而异。您可以通过检查来确定退出状态$?

您可以尝试的另一种方法(如果问题每次都在循环中发生)是进行自己的锁定:

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 回答