我不得不为celery编写我自己的 CentOS init.d 脚本,因为它只为 Debian 提供了一个。你可以看到我在回答我自己的堆栈溢出问题3989656时写的脚本。
但是这个脚本有问题。如果我调用它:
sudo service celeryd start
Run Code Online (Sandbox Code Playgroud)
然后我需要在它完成后按 Enter 以获得 shell 提示。这是一个问题,因为我想通过 ssh 从另一台机器通过执行以下操作来调用它:
ssh 192.168.2.3 sudo service celeryd start
Run Code Online (Sandbox Code Playgroud)
并且 ssh 永远不会返回。(我使用结构来启动和停止远程服务,这会挂起它,因为它调用了上面的 ssh 命令)。
什么会导致这种行为,我该如何在我的脚本中修复它?
请注意,如果我按照 Thomas Themel 在评论中的建议执行“sh -x /etc/init.d/celeryd”,则输出为:
runuser -s /bin/bash - apache -c 'ulimit -S -c 0 >/dev/null 2>&1 ; /usr/local/django/portalapps/manage.py celeryd --pidfile /var/run/celery.pid -f /var/log/celeryd.log -l INFO'
Run Code Online (Sandbox Code Playgroud)
我不明白 /etc/init.d/functions 中的守护程序函数(这是产生这一系列 bash 命令的原因)实际上是如何守护进程的。
在文件系统重新挂载为只读后,有没有办法在关机时运行脚本?
我有一个连接到无线套接字的树莓派,我可以通过发送器和脚本来控制它。在文件系统以只读方式安装后,我想在关机时关闭该套接字(关闭树莓派的电源)。
我试过这个:
[Unit]
Description=Test
DefaultDependencies=no
Requires=shutdown.target umount.target final.target
After=shutdown.target umount.target final.target
[Service]
Type=oneshot
ExecStart=/test
KillMode=none
[Install]
WantedBy=halt.target
Run Code Online (Sandbox Code Playgroud)
脚本 /test 确实输出当前的挂载。当它在关机时运行时,它声明根文件系统的读/写,而不是预期的只读。
编辑:
/test 的内容:
#!/bin/bash
echo -n 'Debug-Mount: ' > /dev/tty1
cat /proc/mounts | grep /dev/sda > /dev/tty1
Run Code Online (Sandbox Code Playgroud)
关机时的屏幕输出:
我正在使用在 Ubuntu Server 10.04 上运行的 apache2 和 postgres。
我已经删除了这两个应用程序的启动脚本,并且我正在使用 supervisor 来监视和控制它们。我遇到的问题是,这两个都需要 /var/run 中的目录(对它们运行的用户具有正确的权限)用于 pid 文件。我如何在启动期间创建这些,因为它们需要以 root 身份创建,然后再分配给正确的用户?
编辑
似乎最好的方法是使用自定义初始化脚本创建目录。由于我根本没有 shell 脚本技能,我该怎么做?
我对 *nix 相当陌生,并且遇到了删除多个进程的需要,这些进程应该在 100% 的时间运行。使用&.
我在 init.d 脚本中使用以下行来执行此操作(以用户身份运行user:
su -c 'process arg1 arg2 -w - | process2 arg1 -r - &' user
(其中 -w 写入 STDOUT,-r 从 STDIN 读取)
具体来说,我知道这通常是不可接受的,因为这些过程没有很好地屏蔽外部影响。
为“服务”创建后台作业是否可以接受?
我应该使用 FIFO/命名管道来处理进程间通信吗?
如果是这样,我还应该将两个进程都创建为后台作业吗?这个稳定吗?
有关详细信息,请参阅此邮件列表线程。
谢谢,
马特
有没有一些工具可以显示所有可用的 init 脚本(在 Debian 上),除了必须记住一个位置/etc/init.d,更不用说不是所有的东西都有一个 init 脚本?
我目前正在从 CentOS 5.5 迁移到 6.4。将/etc/inittab 的内容转换为新贵很有趣。遇到了很多小问题,但现在我已经掌握了。我找到的最好的文档是针对 Ubuntu 的:
http://upstart.ubuntu.com/cookbook/#id416
它对我遇到的各种新贵问题很有帮助。唯一的问题是某些 ubuntu 项目不适用于 CentOS(无法使记录器功能正常工作,但找到了解决方法“exec >/dev/kmsg 2>&1”)。
是否有任何 CentOS 特定文档可以帮助处理新贵脚本?CentOS 需要与 Ubuntu 相同的文档..Argg!!
由于我是新贵的新手,我仍然不确定最佳实践是什么。下面的脚本似乎也很好用。欢迎对此发表任何评论..谢谢!!
这是一个启动 TTY 的脚本,用于向服务器提供调制解调器拨号服务。它可以为通过 USB、串行、网络调制解调器组(数字端口服务器)连接的调制解调器启动 TTY。它使用由管理员维护的文件来指定要启动的 tty:
/etc/init/ssi-ttys.conf:
start on stopped rc RUNLEVEL=[2345]
task
script
#--------------------------------------------------------------------
# The following exec will send the data to the kernels ring buffer.
# Once the syslog daemon starts, this data will be redirected to the
# system log file. So, the echo below will be written out to
# /var/log/messages. …Run Code Online (Sandbox Code Playgroud) 我想将一些 OpenRC init 脚本迁移到 systemd,但我认为这是 systemd 中环境变量处理的一般问题。
原始 OpenRC 文件
有一个文件,例如/etc/conf.d/fooservice内容
# FOO 变量的值 # 你可以通过取消注释这一行来覆盖默认值 # FOO=值1 # BAR 变量的值 酒吧=值2
在原始启动脚本中/etc/init.d/fooservice,有
FOO=${FOO:-default_foo_value}
BAR=${BAR:-default_bar_value}
所以,结果是$FOO==default_foo_value和$BAR==value2
迁移的 systemd 文件
现在我有 systemd 服务文件/usr/lib/systemd/system/fooservice.service,其中包含
[服务] EnvironmentFile=/etc/conf.d/fooservice ExecStart=/usr/bin/fooservice $FOO $BAR
但是有一个问题$FOO是没有初始化为default_foo_value
如果环境文件中没有值,有没有办法告诉 systemd 使用默认值?有没有办法使用具有默认值的中间环境文件或多个链接的环境文件?
解决方案:
这不是好办法。/etc/conf.d/fooservice文件可能不兼容,因为它是“shell 脚本”,而 systemd 需要“环境文件”。在基本赋值中,看似相似,实则不是一回事。
Gentoo对此的首选解决方案是将所有内容放入服务文件和服务配置文件中,而不是使用其他conf.d文件。
工作但不是首选的解决方案:
仅使用此方法来像 systemd 一样快速运行 OpenRC 服务。
/usr/lib/systemd/system/fooservice.service 现在包含
[服务] 环境=“FOO=default_foo_value” 环境=“BAR=default_bar_value” EnvironmentFile=/etc/conf.d/fooservice ExecStart=/usr/bin/fooservice $FOO $BAR
我正在尝试使用 docker -baseimage将当前基于 VM 的基础架构迁移到基于 Docker 的基础架构,它使用 runit/runsv 来启动和监督系统服务。现在,虽然将自己编写的 Python 程序安装为服务显然非常容易,但我正在努力将/etc/init.d/*脚本转换为 runit 服务。
有时这很容易,而且http://smarden.org/runit/runscripts.html 上也有一个列表,但其中一些脚本不适用于(最新版本的)Ubuntu 路径,而且我想知道是否我有时应该将进程嵌入到 chroot 中,或者让它以不同的用户身份运行。
那么,是否有一种安全可靠的方法可以将 Ubuntu 中的 init 脚本转换为简单的 runit-runnable 脚本?
我正在尝试创建一些应该在开始时运行的脚本。
现在我在 /etc/init.d/ 下创建了一些 myScript 文件,然后运行 sudo chkconfig --add myScript;
chkconfig --list myScript输出为:
myScript 0:off 1:off 2:on 3:on 4:on 5:on 6:off
我的脚本:
#!/bin/sh
# chkconfig: 2345 98 02
# description:
# processname:
# Source function library.
if [ -f /etc/init.d/functions ] ; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi
KIND="_"
start() {
echo starting `date` >> ~/myScript.log
}
stop() {
echo stopping myScript
}
restart() {
echo restarting
}
case …Run Code Online (Sandbox Code Playgroud) 我想在启动时启动 Qt 应用程序。该应用程序使用了 weston/wayland 桌面的一些功能,因此它应该在 weston 启动后立即在 weston 上启动。通常,我使用 SSH 连接到目标平台并使用以下命令启动应用程序:
systemctl stop weston
weston --tty=1
./QtApp
Run Code Online (Sandbox Code Playgroud)
如果我不杀死韦斯顿,也不用 TTY 启动它,我会收到以下错误:
Failed to create display
Run Code Online (Sandbox Code Playgroud)
我试图做的是设置一个启动脚本并将其集成到 systemd 中:
[Unit]
Description = Onyx Service
After = weston.service
Type = forking
[Service]
ExecStart = /bin/bash /opt/onyx-start
[Install]
WantedBy = multi-user.target
Run Code Online (Sandbox Code Playgroud)
但是,正如您所猜测的,这行不通。我需要设法在未使用 TTY 选项启动的现有 Weston 实例上启动应用程序。
init-script ×10
systemd ×3
centos ×2
linux ×2
sysvinit ×2
ubuntu ×2
amazon-ec2 ×1
aws ×1
daemon ×1
debian ×1
docker ×1
init.d ×1
openrc ×1
permissions ×1
qt ×1
readonly ×1
runit ×1
shell-script ×1
shutdown ×1
ssh ×1
startup ×1
unmounting ×1
upstart ×1
wayland ×1