我有这两项服务,一项是Google启动脚本服务,第二项是redis服务,我想在启动脚本服务启动并完成后启动redis服务,我有以下systemd配置,但我的redis服务无法启动有了这些配置
google-startup-scripts.service
[Unit]
Description=Google Compute Engine Startup Scripts
After=network-online.target network.target rsyslog.service
After=google-instance-setup.service google-network-daemon.service
After=cloud-final.service multi-user.target
Wants=cloud-final.service
After=snapd.seeded.service
Wants=snapd.seeded.service
[Service]
RemainAfterExit=yes
ExecStart=/usr/bin/google_metadata_script_runner --script-type startup
KillMode=process
Type=oneshot
StandardOutput=journal+console
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
redis.service
[Unit]
Description=Redis In-Memory Data Store
After=google-startup-scripts.service
[Service]
Type=notify
PIDFile=/run/redis-6378.pid
ExecStart=/usr/bin/redis-getdevice /etc/redis-getdevice/6378.conf
ExecStop=/usr/bin/redis-cli -p 6378 shutdown
Restart=always
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
一旦 google-startup-script.service 运行并执行操作并进入退出状态。并且 redis 服务根本没有启动(我After
在单元中使用)我在这里做错了什么
systemctl cat myunit.service
打印主文件的内容myunit.service
,然后打印任何覆盖文件。有没有一种方法可以打印 systemd 实际使用的单元文件,即通过将覆盖合并到主单元中而形成的文件?
在 systemd(UbuntuLinux 18.04 bionic 上的 v237)中,我可以创建一个服务文件(用于A.service
),并指定另一个服务Requisite=B.service
。这意味着如果我尝试启动A.service
但B.service
尚未运行,则 A.service 将不会启动。这是 的弱版本,当我尝试启动时Requires
它将启动。B.service
A.service
有相反的吗?我可以说\xe2\x80\x9c如果B.service正在运行,那么就不要启动这个服务\xe2\x80\x9d / \xe2\x80\x9c如果B.service正在运行,那么A.service无法启动\xe2\ x80\x9d?
\n\n文档说如果我这样做Conflicts=B.service
,那么启动A
将停止 B 然后启动 A。但我不希望 B 停止,我只是希望 A 无法启动。我想要的东西就是Conflicts
这样Requisite
的Requires
。
我可能可以将 更改ExecStart
为会失败的 shell 命令systemctl is-active B.service
或某种 hack。有没有合适的解决办法呢?
不久前,我根据文档设置了一个 systemd 服务,以便在网络上线后运行。\n这是单元文件:
\n[Unit]\nDescription=Refresh Pacman mirrorlist with Reflector.\nDocumentation=https://wiki.archlinux.org/index.php/Reflector\nWants=network-online.target\nAfter=network-online.target nss-lookup.target\n\n[Service]\nType=oneshot\nExecStart=/usr/bin/reflector @/etc/xdg/reflector/reflector.conf\nCacheDirectory=reflector\nCapabilityBoundingSet=~CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_CHOWN CAP_FSETID CAP_SETFCAP CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_IPC_OWNER CAP_NET_ADMIN CAP_SYS_TIME CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE CAP_KILL CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW CAP_SYS_NICE CAP_SYS_RESOURCE CAP_MAC_ADMIN CAP_MAC_OVERRIDE CAP_SYS_BOOT CAP_LINUX_IMMUTABLE CAP_IPC_LOCK CAP_SYS_CHROOT CAP_BLOCK_SUSPEND CAP_LEASE CAP_SYS_PACCT CAP_SYS_TTY_CONFIG CAP_WAKE_ALARM\nEnvironment=XDG_CACHE_HOME=/var/cache/reflector\nLockPersonality=true\nMemoryDenyWriteExecute=true\nNoNewPrivileges=true\nPrivateDevices=true\nPrivateTmp=true\nPrivateUsers=true\nProtectClock=true\nProtectControlGroups=true\nProtectHome=true\nProtectHostname=true\nProtectKernelTunables=true\nProtectKernelLogs=true\nProtectKernelModules=true\nProtectSystem=strict\nReadOnlyPaths=/etc/xdg/reflector/reflector.conf\nReadWritePaths=/etc/pacman.d/mirrorlist\nRemoveIPC=true\nRestrictAddressFamilies=~AF_AX25 AF_IPX AF_APPLETALK AF_X25 AF_DECnet AF_KEY AF_NETLINK AF_PACKET AF_RDS AF_PPPOX AF_LLC AF_IB AF_MPLS AF_CAN AF_TIPC AF_BLUETOOTH AF_ALG AF_VSOCK AF_KCM AF_UNIX AF_XDP\nRestrictNamespaces=true\nRestrictRealtime=true\nRestrictSUIDSGID=true\nSystemCallArchitectures=native\nSystemCallFilter=@system-service\nSystemCallFilter=~@resources @privileged\nUMask=177\n\n[Install]\nWantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n根据文档,该服务应该已正确设置以等待建立网络连接(即:我已登录,NetworkManager 已连接到 WiFi 并且系统已分配了 IP)。
\n\n
network-online.target
是一个主动等待网络“up”的目标,其中“up”的定义由网络管理软件定义。通常它表示某种已配置的、可路由的 IP …
我想看看哪些systemd
服务消耗最多的内存。
有没有办法按内存使用情况列出所有正在运行(和/或启用)的 systemd 服务?
使用OnCalendar
systemd 计时器,我可以创建类似这样的东西,每 5 分钟运行一次。
OnCalendar=*:0/5
Run Code Online (Sandbox Code Playgroud)
是否可以仅在 5 点(00:05、00:15、00:25...)结束的每分钟运行它?
和/或仅在每分钟以 0 结尾(00:00、00:10、00:20...)?
主要目标是在两台服务器上有一个计时器,以便每台服务器在空闲时间运行;万一其中一个失败,另一个将至少每 10 分钟(而不是 5 分钟)运行一次。
这真的很烦人,systemd
只回应我的服务文件配置错误,但没有具体指出错误在哪里:
/lib/systemd/system/auto_pgha.service
:
[Unit]\nDescription=PostgreSQL High Availability\nAfter=network.service\nAfter=firewalld.service\n\n\n[Service]\nType=simple\nWorkingDirectory=/etc/repmgr\nExecStartPre=/bin/bash -c 'echo -e "\\n" `date +"%Y/%m/%d %a, %X"`": STARTING \\n" >> pgha.log'\nExecStart=/bin/bash -c "python3 pg_high_availability.py &>> pgha.log"\nRestart=always\nRestartSec=3\n\n[Install]\nWantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n在目录内/etc/repmgr
这两个命令运行得很好。但 systemd 服务只是响应了一个错误:
# systemctl start auto_pgha\nFailed to start auto_pgha.service: Unit auto_pgha.service has a bad unit file setting.\nSee system logs and 'systemctl status auto_pgha.service' for details.\n\n# systemctl status -l auto_pgha\n\xe2\x97\x8b auto_pgha.service - PostgreSQL High Availability\n Loaded: bad-setting (Reason: Unit auto_pgha.service has a bad unit file setting.)\n......\nauto_pgha.service: Unit configuration has …
Run Code Online (Sandbox Code Playgroud)