1

我想在重新启动时在 SCREEN 环境中执行一系列命令。我可以通过我的 crontab 做到这一点:

@reboot /usr/bin/screen -d -m -S myPseudoDaemon /path/to/something.sh

...所以我可以将命令放在“something.sh”中。使这种情况复杂化的是,一系列命令包括一个 sudo 和一个 chroot:

sudo -i # become root
chroot /opt/debianUnstable # enter the chroot-ed Debian unstable
/bin/bash # source my bash setting, including mandatory env vars
/path/to/whatever.sh # the actual "daemon"

知道我该怎么做吗?

4

4 回答 4

1

当您执行 chroot 时,您将拥有一个交互式 shell 或带有特殊根目录的运行命令,这意味着您的根已经在新的根目录下。

首先你会在新的根目录下执行shell,

chroot [OPTION] NEWROOT /bin/bash --login

从 bash 手册页中,我们知道当 bash 作为交互式登录 shell 或作为带有 --login 选项的非交互式 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在) . 读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件中读取并执行命令。因此,您可能会将/path/to/whatever.sh添加到与新根相关的配置文件脚本中。

于 2013-09-20T09:07:51.800 回答
0

您的 /bin/bash 正在创建一个外壳。你应该写:-

/bin/bash /path/to/whatever.sh # the actual "daemon"
于 2013-09-20T09:08:22.603 回答
0

您是否尝试在根 crontab 中安排它?

它将允许您在没有密码的情况下进行 chroot。

要使用您的应用程序用户运行命令,您可以使用:

su -u <user> -c <command>
于 2013-09-20T09:27:22.153 回答
0

最后,我使用 jcb00s 和 Teg 的建议解决了这个问题 - 但由于我需要环境的特定部分,我将它放在一个在 chroot 中执行的脚本中:

@reboot /usr/bin/screen -d -m -S autoLoginScreen /root/chrootPollAndBuildWithUnstable.sh

在 /root/chrootPollAndBuildWithUnstable.sh 中:

# cat /root/chrootPollAndBuildWithUnstable.sh
chroot /opt/debianUnstable/ /pollAndBuildInsideChroot.sh

在 chroot-ed debian 不稳定文件系统中,我做了最后一步......

# cat /opt/debianUnstable/pollAndBuildInsideChroot.sh 
su - <user> -c '/bin/bash /home/user/work/builder.sh'

...构建器脚本设置环境并继续构建的地方。

于 2013-09-24T10:21:43.327 回答