由于遗留(又名公司)原因,我有许多运行最新 Debian 版本(Debian 9、Debian 10)的服务器,它们还需要运行较旧的服务,例如 MySQL 5.5。这是通过(预先存在的)Debian Jessie schroot
(构建的使用本指南)已安装服务并从主机复制用户。
然而,我一直没能找到一个简单的,值得信赖的意味着当 schroot 来自用户时,让该 schroot 中的服务在引导时启动,即:schroot 由其 root 用户之一运行,不一定由root
.
我们有一个启动 schroot 的脚本:
#at /usr/local/bin/start-legacy.sh
schroot -b -c legacy_schroot -u root -n Session
(这可以由 schroot 的 root 用户运行)
以及在启动时调用的 crontab:
#at the root-user user's crontab -e
@reboot /usr/local/bin/start-legacy.sh
但是,我似乎找不到在启动时将命令传递到此 schroot 会话的方法,以便让它启动服务。以下所有事情都不起作用:
1.- 在启动脚本期间立即传递命令:
#at /usr/local/bin/start-legacy.sh
schroot -b -c legacy_schroot -u root -n Session
schroot -r Session -u root -- service mysql start
通过这种方式完成后,当用户登录并手动运行脚本时,它可以完美运行,但是当从 crontab 运行时,它只启动会话,而不传递以下命令。它似乎也没有报告错误,或者即使报告了错误,我也找不到它。
2a.- 将启动添加到 crontab
#at crontab -e
@reboot /usr/local/bin/start-legacy.sh
@reboot sleep 10 && bash -l -c 'schroot -r -c Session -u root -- service mysql start'
如果我在 crontab 中执行此操作,效果与上面相同:脚本正常启动,但启动命令永远不会传递。
2b.- 将启动脚本添加到 crontab 的命令中
#at crontab -e
@reboot /usr/local/bin/start-legacy.sh
@reboot sleep 10 && bash -l -c '/usr/local/bin/start-legacy-mysql.sh'
(其中第二个脚本有schroot -r
命令)
一样的区别。
3.- 使用/etc/rc.local
#at /etc/rc.local
su usuario -l -c '/usr/local/bin/start-legacy.sh'
su usuario -l -c '/usr/local/bin/start-legacy-mysql.sh'
exit 0
这仅有的无需“su”即可工作,使 schroot 会话由 root 启动;但我需要以普通用户身份运行会话,以便用户随后可以连接到 schroot。和su,它给出了“未授权”错误,我无法获取该错误,因为除了 dmesg 之外我找不到启动日志,并且屏幕在启动过程中会清除。
即使它有效,也需要 root 来设置,而 crontab 解决方案则不需要。我个人并不介意,但我不认为老板们会愿意给技术人员 root 访问权限,因为他们的唯一任务就是处理 MySQL 来进行设置。
tl;dr:我希望在引导期间代表用户运行许多命令,以便在给定用户是 root 的 schroot 上执行各种任务。