我尝试添加用户帐户,但它给了我 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
由您的操作系统提供,并且不是标准化工具,因此其使用和退出状态行为会因平台而异。您可以通过检查来确定退出状态$?
。
您可以尝试的另一种方法(如果问题每次都在循环中发生)是进行自己的锁定:
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