systemd 为啥会有那么大的争议
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了systemd 为啥会有那么大的争议相关的知识,希望对你有一定的参考价值。
参考技术A 说点systemd前 运行靠代码区各linux发行版实太麻烦redhatredhat-release,suseubuntu关键尼玛各文件内部格式统要代码准确解析发行版名称版本号知道要拉坨if/else, lsb根本扶墙 systemd提供统格式/etc/os-release文件切变so easy 变太管理员认没啥必要 前init用各软件熟悉配置现systemd干点太syslogd工作做udevd工作做连lxc工作都想抢自带nspawn甚至霸道要求能通systemd管理cgroup管理员需要再习何配置linux且文档少新配置令迷惑比pts配置想搞懂能读代码 我站发角度觉systemd tm太难debug扯dbus要研究dbus何调为啥我的 Erlang 启动脚本可以从控制台运行,但从 init 系统(sysvinit、upstart、systemd)运行时却不能运行?
【中文标题】为啥我的 Erlang 启动脚本可以从控制台运行,但从 init 系统(sysvinit、upstart、systemd)运行时却不能运行?【英文标题】:Why does my Erlang boot script work from console but does not work when run from init system (sysvinit, upstart, systemd)?为什么我的 Erlang 启动脚本可以从控制台运行,但从 init 系统(sysvinit、upstart、systemd)运行时却不能运行? 【发布时间】:2016-10-04 00:59:13 【问题描述】:我有一个 Erlang 启动脚本,我可以这样启动:
/usr/bin/erl -boot /path/to/my-boot-script
从控制台运行时它可以工作,但当我从 systemd 运行它时失败且没有任何错误消息。 systemd 单元文件如下所示:
[Unit]
Description=My daemon written in Erlang
[Service]
Type=simple
ExecStart=/usr/bin/erl -boot /path/to/my-boot-script
Restart=always
[Install]
WantedBy=multi-user.target
日志显示系统正常启动,然后突然终止,没有任何类型的错误消息。到底是怎么回事?
【问题讨论】:
【参考方案1】:原来你必须将-noinput
参数传递给erl。否则它将尝试打开标准输入进行读取,因为那里没有任何内容而失败并终止而没有任何类型的错误消息。
这行得通:
[Unit]
Description=My daemon written in Erlang
[Service]
Type=simple
ExecStart=/usr/bin/erl -noinput -boot /path/to/my-boot-script
Restart=always
[Install]
WantedBy=multi-user.target
【讨论】:
【参考方案2】:我刚刚设法使用带有 systemd 的 erlang 安装系统来安装代码存储库。此过程符合有关设置嵌入式系统的 erlang 文档。这是我学到的:
1) 需要在 erts/examples 中添加安装工具的路径。这是我的 .erlang 文件的摘录:
code:add_path(filename:join([os:getenv("ROOTDIR"),"lib/sasl-2.6/examples/ebin"])).
2) 按照 erlang/doc/system_principles/create_target.html 进行构建
target_system:create("mysystem").
3) 将构建提取到临时位置。对于我的应用程序,它是通过 erlang 完成的:
target_system:install("code_repository", "/home/tony/Projects/code_repository/release_test").
4) 编辑 start 的最后一行运行 erl 并删除 -daemon 选项并添加所需的任何 erlang 运行时参数,如 -sname 或 -set_cookie。这在 erlang/doc/embedded/embedded_solaris.html#idm45326372314928 中有概述。这是我系统中编辑的行:
$ROOTDIR/bin/run_erl /tmp/ $ROOTDIR/log "exec $ROOTDIR/bin/start_erl $ROOTDIR $RELDIR $START_ERL_DATA -sname code_repository"
5) 安装到运行时位置(不要忘记 sys.config) 6) 如下设置 .services 文件。该文件存储在 /etc/systemd/system/code_repository.service 中:
[Unit]
Description=Tonys Code Repository Daemon
[Service]
Type=simple
WorkingDirectory=/var/opt/code_repository
Environment=HOME=/var/opt/code_repository
ExecStart=/var/opt/code_repository/bin/start
Restart=yes
[Install]
WantedBy=multi-user.target
删除 -daemon 标志对于作为简单服务运行是必不可少的,因为简单服务会运行并且不会返回,除非它们失败。在此过程中使用 run_erl 允许 erlang 工具附加到守护程序以进行维护..
【讨论】:
以上是关于systemd 为啥会有那么大的争议的主要内容,如果未能解决你的问题,请参考以下文章