linux - 如何让这个 systemd 脚本在 ArchLinux 上运行?

标签 linux systemd

我有一个火线设备连接到运行 arch linux 的机器上。

我让 FFADO 开始工作,在执行 ffado-dbus-server 后,我可以开始使用带有 Jack 和 Pulseaudio 的火线设备(该卷积与我的问题完全无关)

我基本上每次启动时都必须运行 3 个不同的步骤才能让声音正常工作。我正在尝试让所有这些魔法在启动时自动发生。

我读到了/etc/rc.local,但我的 arch linux 安装上似乎不存在这样的文件。我读到了 arch linux 上的启动过程,似乎 arch 不使用 rc.local 而是使用 systemd

我浏览了arch wiki page on systemd并尝试在 /usr/lib/systemd/system

中创建一个简单的 ffado-dbus.service 单元文件

我开始尝试使用dbus单元类型,然后尝试oneshot,最后simple

无论我做什么,结果都非常一致。服务失败。

我还尝试将服务放入 usr/lib/systemd/user 中,并尝试将其作为 systemctl --user start 运行,但这也产生了相同的失败。

我拥有的单元文件的最简单示例是这样的:

[Unit]
Description=FFADO DBus startup

[Service]
Type=simple
ExecStart=/usr/sbin/ffado-dbus-server

这会产生以下状态:

[pigdog@livingroom system]$ sudo systemctl status ffado-dbus -l
● ffado-dbus.service - FFADO DBus Service
   Loaded: loaded (/usr/lib/systemd/system/ffado-dbus.service; static; vendor preset: disabled)
   Active: failed (Result: core-dump) since Sun 2015-03-01 04:31:59 MST; 5s ago
  Process: 3934 ExecStart=/usr/bin/ffado-dbus-server (code=dumped, signal=ABRT)
 Main PID: 3934 (code=dumped, signal=ABRT)

Mar 01 04:31:59 livingroom ffado-dbus-server[3934]: FFADO Control DBUS service
Mar 01 04:31:59 livingroom ffado-dbus-server[3934]: Part of the FFADO project -- www.ffado.org
Mar 01 04:31:59 livingroom ffado-dbus-server[3934]: Version: 2.2.1-Unversioned directory
Mar 01 04:31:59 livingroom ffado-dbus-server[3934]: (C) 2008, Pieter Palmers
Mar 01 04:31:59 livingroom ffado-dbus-server[3934]: This program comes with ABSOLUTELY NO WARRANTY.
Mar 01 04:31:59 livingroom ffado-dbus-server[3934]: -----------------------------------------------
Mar 01 04:31:59 livingroom systemd[1]: ffado-dbus.service: main process exited, code=dumped, status=6/ABRT
Mar 01 04:31:59 livingroom systemd[1]: Unit ffado-dbus.service entered failed state.
Mar 01 04:31:59 livingroom systemd[1]: ffado-dbus.service failed.
Mar 01 04:32:00 livingroom systemd-coredump[3944]: Process 3934 (ffado-dbus-serv) of user 0 dumped core.

ffado-dbus-server的主进程中发生了一些神秘的代码6/ABRT

我认为这是因为 systemd 运行的“环境”不包含进程或 ffado 需要运行的东西。我不明白的是如何确定缺少什么,然后如何将其提供给 systemd 环境。

或者,我想让 systemd 环境与我刚刚执行 systemctl 调用的“pigdog”用户环境相匹配。我认为这就是我要做的,将 ffado-dbus.service 文件移动到 /usr/lib/systemd/user 中,然后像 systemctl --user 一样调用 systemctl,但这会产生相同的错误。

我还尝试将 User=pigdog 指令添加到单元文件的 [Service] 部分,但没有成功。

我可以在以 Pigdog 身份登录时从 bash 运行 /usr/bin/ffado-dbus-server ,没有任何问题。当脚本成功时,我得到以下输出:

[pigdog@livingroom system]$ /usr/bin/ffado-dbus-server
-----------------------------------------------
FFADO Control DBUS service
Part of the FFADO project -- www.ffado.org
Version: 2.2.1-Unversioned directory
(C) 2008, Pieter Palmers
This program comes with ABSOLUTELY NO WARRANTY.
-----------------------------------------------

1425209640984446:  (ffado-dbus-server.cpp)[ 270] main:  Discovering devices...
00973362057: Debug (devicemanager.cpp)[ 354] discover: Starting discovery...
00973405357: Debug (devicemanager.cpp)[ 616] discover: driver found for device 0
00973405880: Debug (devicemanager.cpp)[ 653] discover: discovery of node 0 on port 0 done...
00973405944: Debug (devicemanager.cpp)[ 661] discover: Discovery finished...
00973405980: Debug (devicemanager.cpp)[1258] showDeviceInfo: ===== Device Manager =====
00973406020: Debug (Element.cpp)[ 121] show: Element DeviceManager
00973406047: Debug (devicemanager.cpp)[1266] showDeviceInfo: --- IEEE1394 Service  0 ---
00973406085: Debug (devicemanager.cpp)[1276] showDeviceInfo: --- Device  0 ---
00973406113: Debug (devicemanager.cpp)[1279] showDeviceInfo: Clock sync sources:
00973406165: Debug (devicemanager.cpp)[1288] showDeviceInfo:  Type: Internal          , Id:  0, Valid: 1, Active: 1, Locked 1, Slipping: 0, Description: Internal sync
00973406199: Debug (devicemanager.cpp)[1288] showDeviceInfo:  Type: ADAT              , Id:  1, Valid: 1, Active: 1, Locked 1, Slipping: 0, Description: ADAT optical
00973406237: Debug (devicemanager.cpp)[1288] showDeviceInfo:  Type: SPDIF             , Id:  2, Valid: 1, Active: 1, Locked 1, Slipping: 0, Description: SPDIF/Toslink
00973406266: Debug (devicemanager.cpp)[1288] showDeviceInfo:  Type: Erratic type      , Id:  3, Valid: 0, Active: 0, Locked 0, Slipping: 0, Description: SMPTE
00973406303: Debug (devicemanager.cpp)[1288] showDeviceInfo:  Type: WordClock         , Id:  4, Valid: 1, Active: 1, Locked 1, Slipping: 0, Description: Wordclock
00973409421:  (ffado-dbus-server.cpp)[ 329] main: DBUS service running
00973409433:  (ffado-dbus-server.cpp)[ 330] main: press ctrl-c to stop it & exit
00973409436: Debug (ffado-dbus-server.cpp)[ 333] main: dispatching...

最佳答案

当您从 shell 提示符运行启动脚本时,它可以工作,但从 systemd 启动时启动脚本会失败(显然在您的情况下),百分之九十九的问题是环境。

我会将其作为首要任务进行调查 - ffado 包是否设置了其启动脚本所需的一些默认 shell 环境变量。

如果是这样,那么在执行启动脚本之前在 systemd 单元文件中设置相同的环境变量就变得很简单。

关于linux - 如何让这个 systemd 脚本在 ArchLinux 上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28797559/

相关文章:

linux - Ubuntu 上的 Abaqus

linux - 为什么 `rsync <...>/path/to/someDir/path/to/otherDir` 留给我 `/path/to/otherDir/someDir` ,而不是将文件从 `someDir` 同步到 `otherDir` ?

linux - 创建 .tar.gz 文件时排除目录

linux - 在 systemd 服务文件中/内联添加 shell 命令

javascript - 当 Node Js 应用程序开始使用 Systemd 时,Nodejs 应用程序不会生成 python 子进程

windows - linux 需要 'rubygems' 但 windows 不需要。为什么?我可以解决这个问题吗?

linux - 来自 Linux 的远程大型机 session

linux - systemd 一个接一个地启动服务停止问题

ubuntu - exec.Command() 的 Golang cmd.Output() 在 systemd 服务(ubuntu)中引发错误

configuration - 使用 systemd 配置风格的 Docker 配置