我编写了这段代码来在主机系统启动时自动启动 KVM 虚拟机,并在主机系统关闭或重新启动时停止虚拟机。
start on startup
start on started networking and started qemu-kvm and started libvirt-bin
stop on runlevel [016]
kill timeout 70
expect fork
pre-start exec /KVM/luc.sh prepara
exec /KVM/luc.sh avvia
pre-stop script
/KVM/luc.sh ferma
/bin/sleep 20
end script
Run Code Online (Sandbox Code Playgroud)
luc.sh 是一个具有以下功能的脚本:
除了sleep命令之外它都可以工作。我需要延迟主机系统的关闭/重启操作以等待来宾关闭完成。换句话说,我想在/KVM/luc.sh ferma命令后插入约 20 秒的等待。sleep新贵脚本中的调用似乎是异步的。是否可以在 upstart 脚本中进行同步调用?
我的新贵配置看起来像这样
start on filesystem
stop on runlevel S
respawn
exec /path/to/my/script
Run Code Online (Sandbox Code Playgroud)
当这个脚本死掉并重新生成时,我想收到一封电子邮件。这是可能的,还是我使用了错误的工具来完成这项工作?
谢谢!
好吧,这是在融化我的大脑。这可能与我不太了解 Upstart 的事实有关。很抱歉,这个问题很长。
我正在尝试使用 Upstart 来管理 Rails 应用程序的 Unicorn 主进程。这是我的当前/etc/init/app.conf:
description "app"
start on runlevel [2]
stop on runlevel [016]
console owner
# expect daemon
script
APP_ROOT=/home/deploy/app
PATH=/home/deploy/.rbenv/shims:/home/deploy/.rbenv/bin:$PATH
$APP_ROOT/bin/unicorn -c $APP_ROOT/config/unicorn.rb -E production # >> /tmp/upstart.log 2>&1
end script
# respawn
Run Code Online (Sandbox Code Playgroud)
这工作得很好 - 独角兽开始很棒。不好的是,检测到的 PID 不是 Unicorn master 的,而是一个sh进程。这本身也不是那么糟糕 - 如果我没有使用自动独角兽零停机部署策略。因为在我发送-USR2给我的独角兽主人后不久,一个新主人出现了,而旧主人死了……这个sh过程也是如此。所以 Upstart 认为我的工作已经死了,如果我愿意,我不能再用它重新启动restart或停止它stop。
我玩过配置文件,尝试将 -D 添加到 Unicorn 行(如下所示$APP_ROOT/bin/unicorn -c $APP_ROOT/config/unicorn.rb -E production -D:)来守护 Unicorn,然后我添加了该expect daemon …
我有一项服务,我正在尝试为其编写新贵脚本,但进展不太顺利。在某个时候,我决定我需要一个全新的开始并删除了 upstart 配置文件。
stop myservice
rm -f /etc/init/myservice.conf
initctl reload-configuration
Run Code Online (Sandbox Code Playgroud)
但是,新贵仍然在列表中将我的服务显示为“已停止/已终止”。
initctl list
status myservice
Run Code Online (Sandbox Code Playgroud)
这怎么可能,我怎样才能在不重新启动机器的情况下彻底摆脱我的服务?作为参考,initctl --version显示 0.6.5。
在 RHEL6/CentOS6 上,新贵的方式是:
chkconfig add my-svc
chkconfig my-svc on
Run Code Online (Sandbox Code Playgroud)
说明:我写了一个 /etc/init/xvc0.conf 作业。我可以
启动 xvc0
在 CLI 上,但重启后 initctl list 给了我
...
xvc0 stop/waiting
...
Run Code Online (Sandbox Code Playgroud)
所以我需要一种方法将我的工作插入到启动新贵序列中。
(顺便说一句,在研究这个时,我发现(Ububtu)帖子建议将工作创建为 /etc/event.d/xvc0。这似乎是无效的 - start xvc0 给出 Unknown。什么给出?那么 /etc 的目的是什么/event.d?)
干杯,阿尔夫
编辑
虽然不是我问题的直接答案,但我发现了以下内容:
如果在 xvc0.conf 中我使用指令:
在运行级别开始 [2345] 在运行级别停止 [016]
而不是普通的:
start on runlevel 2
start on runlevel 3
...
stop on runlevel 0
...
Run Code Online (Sandbox Code Playgroud)
作业在启动时启动
我找到了指向(非常令人困惑的)指令的指针:
启动时停止 rc RUNLEVEL=[2345] 停止启动时 rc RUNLEVEL=[016]
哪些也在 prefdm.conf 工作中使用,哪些似乎也有效,但与前者略有不同(不明白如何)并且基本上搞砸了我正在尝试做的事情(即,从/dev/xvc0)。
即便如此,上面的问题仍然存在 - 编辑脚本(并且使用一种相当不透明的语法的语言)以实现自动启动对我来说似乎很不方便。
我已将新贵日志级别设置为“调试”
sudo initctl log-priority debug
Run Code Online (Sandbox Code Playgroud)
但我仍然看不到任何东西/var/log/syslog。
sudo initctl emit hello # no log
sudo initctl start my-broken-service # still no log
Run Code Online (Sandbox Code Playgroud)
我检查了rsyslog配置(在/etc/rsyslog.d/50-default.conf),一切似乎都很好:
*.*;auth,authpriv.none -/var/log/syslog
Run Code Online (Sandbox Code Playgroud)
记录工作
logger hello # prints hello in /var/log/syslog
Run Code Online (Sandbox Code Playgroud)
我正在运行 ubuntu 13.04 和 mint 16,结果是一样的。
我想检查 grub 中的 upstart 选项,但在 grub 的配置中找不到与 upstart 匹配的行。
任何的想法?
编辑:此问题也发生在 Ubuntu 13.10 上。在 Ubuntu 12.04 上,日志消息显示在/var/log/syslog. 在 Ask Ubuntu 上看到这个问题。
如果守护进程死了,我将无法手动重新启动它:start foo导致消息“开始:作业已经在运行:foo”,并stop foo无限期挂起。
start on runlevel [2345]
stop on runlevel [016]
kill timeout 90
expect daemon
pre-start script
rm -f ${HOME}/RUNNING_PID
end script
exec start-stop-daemon \
--pidfile ${HOME}/RUNNING_PID --chuid $USER:$GROUP \
--exec ${HOME}/bin/run --start > run.log 2>&1
Run Code Online (Sandbox Code Playgroud)
没有 $USER 拥有的进程,也没有 pidfile,那么为什么 upstart 认为守护进程仍在运行,否则我如何说服它?
我目前正在构建一个相当复杂的服务器堆栈(一个 ruby on rails 应用程序),我希望开发人员能够在不必自己安装所有东西的情况下工作。因此我使用 Vagrant 来允许他们这样做。
这个想法是,当您第一次安装映像时,它将拉取最新的源并安装依赖项,源通过同步文件夹公开(vagrant 内置功能),以便开发人员可以提交源并在他们自己的环境中编辑它们。Vagrant-box 仅用于服务器。
Vagrantfile 中的同步文件夹条目:
config.vm.synced_folder "gameeso/", "/var/gameeso", :create => "true"
Run Code Online (Sandbox Code Playgroud)
该图像是一个带有 upstart 脚本的 Ubuntu 服务器(脚本在启动时执行,并且仅在 Internet 连接启动时执行):
从 Github 拉取最新的开发分支(如果文件夹不存在)
安装依赖项(这是由脚本完成的)
所有这些都发生在一个同步文件夹中。我对这种方法有一些问题,主要是 Vagrant 清除了我的来宾系统上的同步文件夹。 我通过在 upstart 脚本中添加 'sleep 10' 解决了这个问题,所以它可以等到 Vagrant 设置同步文件夹。
当然,这不是一种安全的方法(如果启动时间超过 10 秒,虽然现在不太可能,我宁愿不知道;))
我的问题是:有没有更好的方法让来宾主机(流浪者图像)填充同步文件夹?
当然,非常感谢提前!
我正在创建一些正在注册以在 CentOS 6.5 上的服务器启动时执行的脚本。
其中一个脚本有一个 while 循环,该循环会阻塞,直到它在引导期间也正在启动的另一个进程的日志中找到成功启动消息(init.d)。
如果我的脚本依赖的这个服务从不将成功启动记录到它的日志文件中并且我的脚本永远挂在 while 循环中,这个特定的场景是否会使操作系统完全挂起并且永远不会启动?init.d 脚本是否有超时设置?
我的脚本注册为在 rc.local 文件上执行。
假设我有一个mydomain使用 MS Active Directory的公司域。在域中,我有用户myuser和youruser. 现在,在一台特定的 Ubuntu 机器上mymachine, myuser 具有 sudo 权限,并且执行sudo su youruser(或sudo -u youruser sh)。由于 myuser 具有必要的 sudoers 配置,因此他不需要输入您用户的密码,并且将有效地成为该机器上的您的用户。
此时会有什么样的youruser特权myuser?显然,如果机器上youruser也有一个主目录,myuser现在可以访问它并读取他的私有本地文件。但是如果尝试使用 kerberos、samba 等访问网络域资源会发生什么?我猜因为他从来没有输入过youruser密码,所以他没有作为域用户进行身份验证,没有 kerberos 票等。所以如果有一个网络服务来检查他的用户 ID 的组成员身份,那也会失败吗?这是如何运作的?他是否被视为不同的用户,例如,mymachine\\youruser与mydomain\\youruser?
假设有一个 web 服务作为机器上的守护程序运行,使用专用域用户myserviceuser。如果此 Web 服务需要访问网络资源,即使用 Kerberos 进行身份验证,那么应该如何设置守护程序,例如从新贵脚本中设置?通常您使用类似的东西启动它sudo -u myserviceuser <cmd>,但鉴于上述假设,这是否会授予 Web 服务访问网络资源的任何权限?该用户的密码不应该在某处输入吗?