Ubuntu服务器Cron任务中切换用户执行单条命令的问题
解决Ubuntu下单条命令切换postgres用户并执行备份的问题
你原来的命令逻辑存在问题:sudo -i -u postgres会启动postgres用户的交互式登录shell,后续通过&&衔接的命令是在原用户的shell环境里执行的,根本没切换到postgres权限下,所以无法生效。要实现单条语句完成切换+执行备份,得把所有要运行的命令打包交给postgres用户的shell执行,以下是两种靠谱的实现方式:
推荐写法:用sh -c打包命令串
直接把备份和后续操作的命令用单引号包裹,通过sh -c让postgres用户的shell一次性执行整个逻辑:
sudo -u postgres sh -c 'pg_dump -Fc DbName > DbName_backup.dump && 后续命令1 && 后续命令2 && 后续命令3'
- 用单引号是为了避免当前shell解析命令里的变量或特殊字符,确保所有逻辑都在postgres用户环境下执行;
- 如果后续命令需要引用当前用户的变量,换成双引号即可,但备份场景下一般单引号更安全。
备选写法:每条命令前加sudo -u postgres
如果不需要加载postgres用户的登录环境(比如.bashrc里的自定义配置),可以去掉-i,给每个命令都加上sudo -u postgres:
sudo -u postgres pg_dump -Fc DbName > DbName_backup.dump && sudo -u postgres 后续命令1 && sudo -u postgres 后续命令2
这种写法虽然能运行,但每条命令都要重复sudo,不如第一种简洁,不推荐用于多命令场景。
Cron配置注意事项
把这个命令加到Cron里时,还要注意两个关键点:
- 指定命令绝对路径:Cron的环境变量PATH范围很窄,最好用
which pg_dump查出pg_dump的绝对路径(比如/usr/bin/pg_dump),避免出现命令找不到的错误; - 确保路径权限:备份文件的存放目录要给postgres用户写入权限,比如提前创建专用备份目录并设置权限:
sudo mkdir -p /var/lib/postgresql/backups/ sudo chown postgres:postgres /var/lib/postgresql/backups/ - 日志重定向:把命令输出重定向到日志文件,方便排查备份失败问题:
sudo -u postgres sh -c '/usr/bin/pg_dump -Fc DbName > /var/lib/postgresql/backups/DbName_backup.dump && 后续命令' >> /var/log/db_backup.log 2>&1
内容的提问来源于stack exchange,提问作者SinaMN75
相关产品推荐
相关产品推荐

