我怎么知道我的 linux 是从systemd什么包开始的?
在研究使用文件锁定的解决方案时,我相信我的代码陷入了死锁。我正在使用 systemd 来启动系统启动过程。使用 alarm(3) 是一种选择,但我想知道 systemd 是否有办法检测挂起的进程并重新启动它们?
目前为了暂时规避这个问题,我计划查看 journalctl 输出,如果它在指定的时间内没有改变,那么我将通过 shell 脚本终止该进程。
只是想知道是否有更好的方法来通过 systemd 或其他方式监控进程。
我正在使用带有单元文件的 systemd 运行节点应用程序。可以使用应用程序日志查看,journalctl -u example.com但日志在某些时候被删除,删除历史记录(我需要调试)。
如何使用 systemd 配置日志轮换,以便我的应用程序日志存储在等中example.com.log.1,example.com.log.2以便查询应用程序的历史记录?
这是我的单元文件:
ExecStart=/usr/bin/node keystone.js
#Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=example.com
User=user
Group=user
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud) 我正在运行一个 Arch Linux(最新的、最新的)机器,并试图让 MySQL 在启动时启动。安装 systemd 软件包后,我可以使用 systemctl,因此我可以执行以下操作:
systemctl start mysqld.service
systemctl [stop|status|restart] mysqld.service
Run Code Online (Sandbox Code Playgroud)
这一切都很好,当我想手动启动/停止时效果很好,但是,当它在启动时启动时(通过在 systemctl 上使用“启用”,我得到了一些令人讨厌的输出):
[root@rudivarch ~]# systemctl enable mysqld.service
Failed to issue method call: No such file or directory
Run Code Online (Sandbox Code Playgroud)
显然,由于其他命令工作得很好,我对此感到非常困惑并且花了很多时间试图弄清楚...... systemctl status 输出这个:
[root@rudivarch ~]# systemctl status mysqld.service
mysqld.service
Loaded: loaded (/etc/rc.d/mysqld)
Active: inactive (dead) since Tue, 31 Jan 2012 15:32:28 +0000; 1min 25s ago
Process: 589 ExecStop=/etc/rc.d/mysqld stop (code=exited, status=0/SUCCESS)
Process: 257 ExecStart=/etc/rc.d/mysqld start (code=exited, status=0/SUCCESS)
CGroup: name=systemd:/system/mysqld.service
Run Code Online (Sandbox Code Playgroud)
任何人都对为什么“启用”不起作用有任何想法?
我创建了一个 systemd 服务,它应该在启动或重新启动时调用一个 shell 脚本。
[Unit]
Description=Starts the DCCA index software
[Install]
WantedBy=multi-user.target
[Service]
ExecStart=/opt/insiteone/bin/indexControl start
ExecStop=/opt/insiteone/bin/indexControl stop
# Execute pre and post scripts as root
#PermissionsStartOnly=true
Restart=on-abort
TimeoutSec=600
Run Code Online (Sandbox Code Playgroud)
最初它一启动就一直在无限循环中重新启动,但是当我添加该TimeoutSec选项时,它会ExecStop在服务第一次启动时立即调用(启动,然后立即停止)。
任何线索,我哪里出错了?
PS:indexControl是一个shell脚本,用来启动其他进程
我有一台 Fedora 23 机器。
我有一个目录/文件同步 bash 脚本,可将我的本地 /home 目录同步到远程目录(在 NAS 机器中)。我手动运行它,但我想创建一个 systemd 服务并使其更灵活,因为其他人使用我的 PC 和他们自己的用户凭据,我想知道用户何时登录并在之后启动我的服务。
我可以从我的服务的 systemd 文件中做些什么,还是我必须从脚本中的代码中进行检查?
我只需要确保我可以访问环境变量(如 $USER)并将其作为服务运行。
在 Linux 中自动挂载设备的方法不断变化,谷歌搜索返回了相当多的解决方案,对现代基于 systemd 的机器具有不同程度的适用性。
似乎存在以下方法:
/etc/fstab以通过 UUID/标签/设备添加每个驱动器的安装。udev 规则(显然“原始规则”可能与现有的 systemd 策略冲突)thunar+thunar-volman包,或nautilus在 Gnome 中使用gnome-volume-manager包自动挂载(显然它们依赖udisks)。选择可能是压倒性的,目前尚不清楚哪种方法是推荐的。此外,似乎不同的自动挂载子系统可能会相互冲突,导致分区由一个工具挂载,然后在几秒钟内被另一个工具自动卸载。
对于具有桌面环境的系统,这很简单,因为它们中的大多数会自动处理 USB 挂载,因此除了在设置中启用自动挂载选项外,不需要额外的操作。
对于主要在文本模式下运行的无头系统,当前的方法是什么?
所有我发现的选项摆弄后usbmount,以(几乎)刚刚工作后,我编辑 /lib/systemd/system/systemd-udevd.service和改变MountFlags=slave,以MountFlags=shared在描述这个问题(???? UPDATE:对于最近的systemd版本PrivateMounts=no,而应使用!)。无需手动向任何配置文件添加任何 UUID 或标签。缺点是它创建的挂载点/media/usbN并不完美,所以我已经切换到automount-usb非常容易设置(只需运行configure.sh脚本)并创建挂载文件夹,/media/<device>_<disk_label>例如像/media/sda2_mylabel(???? UPDATE :automount-usb似乎不可维护)。
相关链接:
我试图通过编写一些服务来更好地理解 systemd。
例如,我很难理解这两种服务之间的差异,我想确保我正确理解它们会更合适。
因此,例如我得到了 rtorrent 服务,定义为 rt 作为系统服务,我可以为用户 X、Y、Z 启用该服务,使用 sudo systemctl enable rt@userX.service
? ~ cat /etc/systemd/system/rt@.service
[Unit]
Description=rTorrent
Requires=network.target local-fs.target
[Service]
Type=forking
KillMode=none
User=%I
ExecStart=/usr/bin/tmux new-session -s rt -n rtorrent -d rtorrent
ExecStop=/usr/bin/tmux send-keys -t rt:rtorrent C-q
WorkingDirectory=/home/%I/
Restart=on-failure
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
我以这种方式定义了保管箱:
? ~ cat /etc/systemd/user/dropbox@.service
[Service]
ExecStart=/bin/sh %h/.dropbox-dist/dropboxd
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
如果我理解得很好,对于许多用户来说,可以在用户级别启动/停止/启用/禁用 Dropbox 服务,即使该用户不是管理员。这是否意味着我可以作为 userX 为 userY 启用它?至于 rt 服务,只有管理员可以启用/启动/停止它......这是系统服务和用户之间的唯一区别吗?
我正在尝试为特定用户启动 systemd 服务(服务名称/目标不相关)。我这样做是因为我需要有一个在启动时运行的应用程序的每个用户进程。
这是我迄今为止取得的成就:
我在/etc/systemd/user/ 中创建了一个单元文件
然后做了以下事情:
~ $ systemctl --user 启用 custom.service
然后如https://wiki.archlinux.org/index.php/Systemd/User#Automatic_start-up_of_systemd_user_instances 中所述,即使没有用户会话运行,也可以使所述服务运行。
~ $ loginctl enable-linger $USER
但是,当我重新启动该服务时,该服务似乎没有启动,并且在 journalctl 中没有看到该服务的任何内容。但是状态说服务已启用:
~ $ systemctl --user 状态传输守护进程
? custom.service - 自定义守护进程
加载:加载(/etc/systemd/user/custom.service;启用;供应商预设:启用)活动:不活动(死)
我也可以通过运行手动运行它,没有问题
~ $ systemctl --user start custom.service
任何人都知道我做错了什么?
我有一项服务,每次启动时都会杀死系统(OOM)。我需要摆脱它,但 debian 8 似乎不再有恢复启动选项,所以我不得不使用 cd 启动并使用救援,chrooted 到 root FS。
现在当我这样做时:
# systemctl
Run Code Online (Sandbox Code Playgroud)
我得到
Running in chroot, ignoring request.
Run Code Online (Sandbox Code Playgroud)
那么当 systemd 不允许我在救援模式下更改配置时,我该如何禁用它呢?