小编bea*_*mit的帖子

查看 systemd 服务的 stdout/stderr

我为自定义应用程序创建了一个简单的 systemd 服务文件。当我手动运行该应用程序时,它运行良好,但是当我使用 systemd 运行它时,我的 CPU 会达到极限。

我正在尝试追踪我的问题出在哪里,但我不知道在哪里可以找到输出(或如何配置 systemd 以将输出放在某处)。

这是我的服务文件:

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

在整个应用程序中,我输出到 stdout 和 stderr。

如何读取守护进程的输出?

编辑:

我发现man systemd.exec,其中提到了该StandardOutput=选项,但我不确定如何使用它。从手册页:

StandardOutput=

控制已执行进程的文件描述符 1 (STDOUT) 连接到的位置。采用inherit、null、tty、syslog、kmsg、kmsg+console、syslog+console或socket 之一。

如果设置为继承标准输入的文件描述符,则为标准输出复制。如果设置为null标准输出将连接到/dev/null,即写入的所有内容都将丢失。如果设置为tty标准输出将连接到 tty(通过 配置TTYPath=,见下文)。如果仅使用TTY 输出,则执行的进程不会成为终端的控制进程,也不会失败或等待其他进程释放终端。 …

logs io-redirection systemd

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

编写基本的 systemd 服务文件

我正在开发一个 Nodejs 应用程序,用户通过 localhost 上的 HTTP 与之交互。几乎没有参数,守护进程几乎没有依赖关系,它只需要在登录时启动。

我想按照每个平台上的习惯用法来启动脚本,这意味着 Ubuntu 上的 Upstart 和 Fedora 上的 systemd。

  • 有没有写systemd系统文件的好教程?
  • 是否有任何“最佳实践”需要注意?

我找到了这些资源:

我主要是在寻找各种 API 作为参考,以及要遵循的基本格式。

systemd services

116
推荐指数
3
解决办法
18万
查看次数

使用 shell 检测初始化系统

这可能与检测操作系统有关,但我特别需要系统上当前使用的 init 系统。

Fedora 15 和 Ubuntu 现在使用 systemd,Ubuntu 过去使用 Upstart(很长时间默认直到 15.04),而其他人使用 System V 的变体。

我有一个应用程序,我正在编写它作为跨平台守护程序。初始化脚本是根据可以在配置时传入的参数动态生成的。

我想做的只是为他们正在使用的特定初始化系统生成脚本。这样,安装脚本可以在没有参数的情况下以 root 身份合理运行,并且守护进程可以自动“安装”。

这是我想出的:

  • 在 /bin 中搜索 systemd、upstart 等
  • 将 /proc/1/comm 与 systemd、upstart 等进行比较
  • 询问用户

这样做的最佳跨/平台方式是什么?

有点相关,我可以依赖 bash 来支持大多数 *nix 还是依赖于发行版/操作系统?

目标平台:

  • 苹果系统
  • Linux(所有发行版)
  • BSD(所有版本)
  • Solaris、Minix 和其他 *nix

shell-script init portability

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

Bash:双重等于与 -eq

我正在 bash 中进行整数比较(试图查看用户是否以 root 身份运行),我发现了两种不同的方法:

双等于:

if [ $UID == 0 ]
then
fi
Run Code Online (Sandbox Code Playgroud)

-eq

if [ $UID -eq 0 ]
then
fi
Run Code Online (Sandbox Code Playgroud)

我知道在 bash 中没有 >= 或 <=,只有 -ge 和 -le,那么为什么有一个==if-eq呢?

比较双方的方式有区别吗?

shell bash arithmetic

59
推荐指数
3
解决办法
9万
查看次数

/etc 和 /usr/local/etc 有什么区别

我正在开发一个需要存储大量应用程序数据的守护进程,我注意到在我的系统 (Fedora 15) 上有一个/usr/local/etc目录。

我决定将我的守护进程安装到/usr/local/bin,我需要一个地方来放置我的配置文件。

我在维基百科上没有看到这个。这是非标准的还是实际上这是安装程序/usr/local/bin以存储配置文件的标准位置?

原因是,我想向系统管理员推销这个,而犯这样的错误并不是一个很好的卖点......

fhs directory-structure

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

如何找到文件系统上的文件数?

我想知道我的文件系统上有多少个文件。我知道我可以做这样的事情:

find / -type f | wc -l

这似乎非常低效。我真正想做的是找到被视为“文件”的唯一 inode 的总数。

有没有更好的办法?

笔记:

我想这样做是因为我正在开发一个文件同步程序,我想做一些统计分析(比如普通用户总共有多少文件与系统上有多少文件)。但是,我不需要知道关于这些文件的任何信息,只需要知道它们存在(路径根本不重要)。我特别想知道每个已挂载的文件系统(及其关联的挂载点)的此信息。

filesystems disk-usage inode

27
推荐指数
1
解决办法
3万
查看次数

从脚本中查找未挂载分区的文件系统

我正在使用 AIF(Arch 安装框架)编写自定义自动安装,我需要在给定分区的分区上找到文件系统。

到目前为止,我有这个:

grok_partitions () {
    local partitions=
    for label in `ls /dev/disk/by-label | grep "Arch"`
    do
        if [ $label == "Arch" ]
        then
            mount_point="/"
        else
            IFS="-" read base mount <<< "${label}"
            mount_point="/${mount}"
        fi

        local partition=$(readlink -f /dev/disk/by-label/${label})
        local part_no=$(echo ${partition} | grep -Po '\d+')
        local fs=$(parted -mls | grep "^${part_no}" | cut -d: -f5)
        partitions+="${partition} raw ${label} ${fs};yes;${mount_point};target;no_opts;${label};no_params\n"
    done

    # do the swap
    if [ -e /dev/disk/by-label/swap ]
    then
        local partition=$(readlink -f /dev/disk/by-label/swap)
        partitions+="$partition raw swap swap;yes;no_mountpoint;target;no_opts;swap;no_params"
    else …
Run Code Online (Sandbox Code Playgroud)

command-line filesystems system-installation block-device

18
推荐指数
3
解决办法
8228
查看次数

我使用 sudo 获得什么环境?

当我运行 sudo 时,我的环境到底发生了什么?

当我运行时sudo command,它似乎没有看到我或 root 的环境。例如,我的两个路径都包含/usr/local/bin,但是如果我尝试在没有完整路径的情况下运行程序之一,则会失败。

我以为 sudo 以 root 身份运行,因此获得了 root 的环境。bash 在 sudo 下执行的方式与在 root 或我的普通用户下执行的方式不同吗?

编辑:

我sudo -i最近一直在使用,但最近它引起了问题,因为我当前的工作目录被设置为/root. 这符合预期(有点),但我仍然不明白为什么 sudo 无法识别我的/usr/local/bin.

编辑:

我正在运行 Fedora 15。

sudo environment-variables

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

自定义 PAM 模块和安全注意事项

我正在编写自己的 PAM 模块,它将成为我正在开发的应用程序的一部分,但我不确定将它放在哪里。我的模块基本上执行类似于 LDAP 的网络级身份验证(当然还有其他 mojo)。

我的/etc/pam.d/目录中有很多配置文件,我知道大多数服务的作用(除了一些服务,比如 atd、polkit、ppp)。我假设使用 PAM 堆栈进行身份验证是这样的:

  1. 根据服务名称运行堆栈(如果存在配置文件)
  2. 如果未通过身份验证,则使用 common-*,其中 * 是模块类型(身份验证、帐户等)
  3. 返回调用应用程序的成功或失败(当然还有任何其他数据)

我在这个假设中正确吗? 是否所有平台都有 common-auth、common-account、common-password 和 common-session?

如果是这样,我正在考虑将它作为sufficient模块放在common-* 的顶部,以便在失败时常规 PAM 堆栈不受影响。这是特别有利的,因为我可以在软件安装时以编程方式执行此操作。

我是否遗漏了任何潜在的安全漏洞?

我找不到关于在哪里集成自定义 PAM 模块或围绕模块放置位置的安全问题的很好的文档。

security authentication pam

8
推荐指数
1
解决办法
2454
查看次数

x 客户端的最大数量是多少?

我正在开发一个 x-server 实现,我想让它尽可能类似于当前的实现。我通读了文档,但找不到任何具体内容。特别是,我正在尝试为 Windows 找到编号方案。在我看来,这是特定于实现的。

无论哪种方式,我发现这与窗口 ID 相关:

XID 的最高 11 位表示客户端,为每个客户端留下 21 位,为每个客户端提供 2^21 (= 2,097,152) 个 XID。

我在别处读到最大 x-clients 是 255: here和here。

是否有关于如何为窗口编号的明确文档?

x11 x-server window

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