标签: init-script

为什么我需要在我的 init.d 脚本完成后按 Enter 来获得我的 shell 提示?

我不得不为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 命令的原因)实际上是如何守护进程的。

ssh centos init-script shell-script

6
推荐指数
2
解决办法
4764
查看次数

systemd:在文件系统以只读方式挂载后关机时运行脚本

在文件系统重新挂载为只读后,有没有办法在关机时运行脚本?

我有一个连接到无线套接字的树莓派,我可以通过发送器和脚本来控制它。在文件系统以只读方式安装后,我想在关机时关闭该套接字(关闭树莓派的电源)。

我试过这个:

[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)

关机时的屏幕输出:

在此处输入图片说明

shutdown init-script unmounting systemd readonly

6
推荐指数
1
解决办法
4445
查看次数

启动时在 /var/run/ 中创建目录

我正在使用在 Ubuntu Server 10.04 上运行的 apache2 和 postgres。
我已经删除了这两个应用程序的启动脚本,并且我正在使用 supervisor 来监视和控制它们。我遇到的问题是,这两个都需要 /var/run 中的目录(对它们运行的​​用户具有正确的权限)用于 pid 文件。我如何在启动期间创建这些,因为它们需要以 root 身份创建,然后再分配给正确的用户?

编辑
似乎最好的方法是使用自定义初始化脚本创建目录。由于我根本没有 shell 脚本技能,我该怎么做?

ubuntu permissions init-script

5
推荐指数
2
解决办法
2万
查看次数

如果进程无法自我守护,在 init 脚本中创建后台作业是一种好习惯吗?

我对 *nix 相当陌生,并且遇到了删除多个进程的需要,这些进程应该在 100% 的时间运行。使用&.

我在 init.d 脚本中使用以下行来执行此操作(以用户身份运行user

su -c 'process arg1 arg2 -w - | process2 arg1 -r - &' user

(其中 -w 写入 STDOUT,-r 从 STDIN 读取)

具体来说,我知道这通常是不可接受的,因为这些过程没有很好地屏蔽外部影响。

为“服务”创建后台作业是否可以接受?

我应该使用 FIFO/命名管道来处理进程间通信吗?

如果是这样,我还应该将两个进程都创建为后台作业吗?这个稳定吗?

有关详细信息,请参阅此邮件列表线程

谢谢,

马特

init-script daemon

5
推荐指数
1
解决办法
2365
查看次数

显示所有 sysvinit init 脚本

有没有一些工具可以显示所有可用的 init 脚本(在 Debian 上),除了必须记住一个位置/etc/init.d,更不用说不是所有的东西都有一个 init 脚本?

debian init-script sysvinit

5
推荐指数
1
解决办法
162
查看次数

CentOS 6 的新贵文档

我目前正在从 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)

linux centos init-script upstart

5
推荐指数
1
解决办法
2万
查看次数

systemd:环境变量的默认值

我想将一些 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

init-script environment-variables systemd init.d openrc

5
推荐指数
1
解决办法
2万
查看次数

将 sysvinit/upstart init 脚本转换为 runit

我正在尝试使用 docker -baseimage将当前基于 VM 的基础架构迁移到基于 Docker 的基础架构,它使用 runit/runsv 来启动和监督系统服务。现在,虽然将自己编写的 Python 程序安装为服务显然非常容易,但我正在努力将/etc/init.d/*脚本转换为 runit 服务。

有时这很容易,而且http://smarden.org/runit/runscripts.html 上也有一个列表,但其中一些脚本不适用于(最新版本的)Ubuntu 路径,而且我想知道是否我有时应该将进程嵌入到 chroot 中,或者让它以不同的用户身份运行。

那么,是否有一种安全可靠的方法可以将 Ubuntu 中的 init 脚本转换为简单的 runit-runnable 脚本?

ubuntu init-script sysvinit docker runit

5
推荐指数
1
解决办法
1448
查看次数

如何在 Amazon linux 上运行启动脚本?

我正在尝试创建一些应该在开始时运行的脚本。

现在我在 /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)

linux init-script amazon-ec2 aws

5
推荐指数
1
解决办法
2672
查看次数

启动时在 westton 上启动 Qt/wayland 应用程序

我想在启动时启动 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 实例上启动应用程序。

startup init-script wayland systemd qt

5
推荐指数
1
解决办法
5167
查看次数