我有一个运行良好的bash脚本,我正在尝试使用crontab运行它。
主要问题是,当我运行脚本时,它会要求我输入sudo密码,以便执行docker命令。因此,当我尝试使用crontab执行脚本时,我会得到以下错误:
权限被拒绝
或
在尝试连接到Docker守护进程时获得拒绝的权限
这是我的bash脚本:
PG_USERNAME=username
PG_DB=example-db
echo "Removing 7 days inactive users..."
sudo docker exec -it example-app psql -U $PG_USERNAME $PG_DB
-c "DELETE from users where created_at <= current_date at time zone 'UTC' - interval '7 days' and is_activated = false;"
&& echo "Users removed!"
|| echo "failed to run command"
这就是我在crontab-e:中运行的内容
* * * * * /home/user/Desktop/Projects/example/remove-inactive-users.sh >> /home/user/Desktop/Projects/example/log.log 2>&1
我尝试更改文件权限,但没有成功:
sudo chown root:root /home/user/Desktop/Projects/example/remove-inactive-users.sh
sudo chmod u+x /home/user/Desktop/Projects/example/remove-inactive-users.sh
我假设您在用户$USER
下运行
您应该确保/etc/sudoers
允许cron用户在没有密码的情况下运行脚本(NOPASSWORD选项(,类似于:
$USER ALL=NOPASSWD:/home/user/Desktop/Projects/example/remove-inactive-users.sh
或者,您也可以授予该用户名直接调用docker的权限(不使用sudo(:sudo usermod -aG docker $USER && exec sg docker newgrp $(id -gn) && sudo systemctl restart docker
我找到了解决方案。
我更改了bash脚本文件权限:
sudo chmod 715 remove-inactive-users.sh
然后我得到了错误:输入设备不是TTY
我解决了将脚本中的docker exec行更改为以下行的问题:
docker exec example-app psql...
@Julien的建议在sudo
领域是正确的。
更基本的方法是创建一个专门的技术用户来运行cron作业。
专用用户的方法为日志记录和过程功能隔离提供了额外的好处。
请参阅这里的Docker官方文档,以及这篇有用的文章。
使用一个没有外壳的技术用户和附加组docker和wheel。
sudo useradd -M -G docker,wheel docker_user_5
在测试docker_user_5
以从cli运行docker之后。
将crontab任务添加到docker_user_5