我为自定义应用程序创建了一个简单的 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 输出,则执行的进程不会成为终端的控制进程,也不会失败或等待其他进程释放终端。 …
我正在开发一个 Nodejs 应用程序,用户通过 localhost 上的 HTTP 与之交互。几乎没有参数,守护进程几乎没有依赖关系,它只需要在登录时启动。
我想按照每个平台上的习惯用法来启动脚本,这意味着 Ubuntu 上的 Upstart 和 Fedora 上的 systemd。
我找到了这些资源:
我主要是在寻找各种 API 作为参考,以及要遵循的基本格式。
这可能与检测操作系统有关,但我特别需要系统上当前使用的 init 系统。
Fedora 15 和 Ubuntu 现在使用 systemd,Ubuntu 过去使用 Upstart(很长时间默认直到 15.04),而其他人使用 System V 的变体。
我有一个应用程序,我正在编写它作为跨平台守护程序。初始化脚本是根据可以在配置时传入的参数动态生成的。
我想做的只是为他们正在使用的特定初始化系统生成脚本。这样,安装脚本可以在没有参数的情况下以 root 身份合理运行,并且守护进程可以自动“安装”。
这是我想出的:
这样做的最佳跨/平台方式是什么?
有点相关,我可以依赖 bash 来支持大多数 *nix 还是依赖于发行版/操作系统?
目标平台:
我正在 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呢?
比较双方的方式有区别吗?
我正在开发一个需要存储大量应用程序数据的守护进程,我注意到在我的系统 (Fedora 15) 上有一个/usr/local/etc目录。
我决定将我的守护进程安装到/usr/local/bin,我需要一个地方来放置我的配置文件。
我在维基百科上没有看到这个。这是非标准的还是实际上这是安装程序/usr/local/bin以存储配置文件的标准位置?
原因是,我想向系统管理员推销这个,而犯这样的错误并不是一个很好的卖点......
我想知道我的文件系统上有多少个文件。我知道我可以做这样的事情:
find / -type f | wc -l
这似乎非常低效。我真正想做的是找到被视为“文件”的唯一 inode 的总数。
有没有更好的办法?
笔记:
我想这样做是因为我正在开发一个文件同步程序,我想做一些统计分析(比如普通用户总共有多少文件与系统上有多少文件)。但是,我不需要知道关于这些文件的任何信息,只需要知道它们存在(路径根本不重要)。我特别想知道每个已挂载的文件系统(及其关联的挂载点)的此信息。
我正在使用 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) 当我运行 sudo 时,我的环境到底发生了什么?
当我运行时sudo command,它似乎没有看到我或 root 的环境。例如,我的两个路径都包含/usr/local/bin,但是如果我尝试在没有完整路径的情况下运行程序之一,则会失败。
我以为 sudo 以 root 身份运行,因此获得了 root 的环境。bash 在 sudo 下执行的方式与在 root 或我的普通用户下执行的方式不同吗?
编辑:
我sudo -i最近一直在使用,但最近它引起了问题,因为我当前的工作目录被设置为/root. 这符合预期(有点),但我仍然不明白为什么 sudo 无法识别我的/usr/local/bin.
编辑:
我正在运行 Fedora 15。
我正在编写自己的 PAM 模块,它将成为我正在开发的应用程序的一部分,但我不确定将它放在哪里。我的模块基本上执行类似于 LDAP 的网络级身份验证(当然还有其他 mojo)。
我的/etc/pam.d/目录中有很多配置文件,我知道大多数服务的作用(除了一些服务,比如 atd、polkit、ppp)。我假设使用 PAM 堆栈进行身份验证是这样的:
我在这个假设中正确吗? 是否所有平台都有 common-auth、common-account、common-password 和 common-session?
如果是这样,我正在考虑将它作为sufficient模块放在common-* 的顶部,以便在失败时常规 PAM 堆栈不受影响。这是特别有利的,因为我可以在软件安装时以编程方式执行此操作。
我是否遗漏了任何潜在的安全漏洞?
我找不到关于在哪里集成自定义 PAM 模块或围绕模块放置位置的安全问题的很好的文档。
filesystems ×2
systemd ×2
arithmetic ×1
bash ×1
block-device ×1
command-line ×1
disk-usage ×1
fhs ×1
init ×1
inode ×1
logs ×1
pam ×1
portability ×1
security ×1
services ×1
shell ×1
shell-script ×1
sudo ×1
window ×1
x-server ×1
x11 ×1