我在 Debian 9 上通过 apt-get 安装了 PostgresQL 11。安装后,我删除了默认数据库集群,并删除了自动启动该集群的所有服务。我现在已经运行 initdb 在自定义位置初始化一个新集群,并编写并启用了 systemd .service 文件以自动运行该文件。
我遇到了一个问题,机器启动时服务成功启动,但随后数据库立即关闭,服务立即停止。当我使用 systemctl 手动启动服务时,也会发生同样的情况。
.服务文件:
[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)
[Service]
Environment=PGDATA=/home/(user)/.db
Environment=PGLOG=/home/(user)/postgres.log
Environment=PGSTARTTIMEOUT=270
Type=notify
User=(user)
Group=(group)
ExecStart=/usr/lib/postgresql/11/bin/pg_ctl start -D ${PGDATA} -l ${PGLOG} -t ${PGSTARTTIMEOUT}
ExecStop=/usr/lib/postgresql/11/bin/pg_ctl stop -D ${PGDATA} -m fast
ExecReload=/usr/lib/postgresql/11/bin/pg_ctl reload -D ${PGDATA}
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=300
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
手动启动集群的命令:
su (user) -c '/usr/lib/postgresql/11/bin/pg_ctl start -D /home/(user)/.db -l /home/(user)/postgres.log -t 270'
Run Code Online (Sandbox Code Playgroud)
通过 systemctl 启动时的 PostgreSQL 日志:
2019-01-13 11:36:16.506 EST [1469] 日志:监听 IPv4 地址“127.0.0.1”,端口 5432
2019-01-13 11:36:16.508 EST …
在启动过程中,使用 systemd 之前版本的 Ubuntu 服务器(例如 14.04),如果非关键 fstab 磁盘脱机,系统将等待挂载该磁盘(30 s iirc),超时并继续启动。
自从从 16.04 升级到 Ubuntu 18.04 以来,由于 systemd 的依赖关系,我认为缺少的 fstab 磁盘会停止启动过程,导致启动时出现“紧急模式...按 Enter 进行维护”提示。
如何找到哪个服务正在使用端口?
\n\n# cat /etc/redhat-release \nRed Hat Enterprise Linux Server release 7.6 (Maipo)\n# netstat -natpv | grep 9090\ntcp6 0 0 :::9090 :::* LISTEN 1/systemd \n# \nRun Code Online (Sandbox Code Playgroud)\n\n请指教。
\n\n# systemctl status cockpit.service \n\xe2\x97\x8f cockpit.service - Cockpit Web Service\n Loaded: loaded (/usr/lib/systemd/system/cockpit.service; static; vendor preset: disabled)\n Active: inactive (dead) since Mon 2019-06-10 12:43:51 EDT; 4 days ago\n Docs: man:cockpit-ws(8)\n Main PID: 15922 (code=exited, status=0/SUCCESS)\n\nJun 10 12:41:48 X.X.X systemd[1]: Starting Cockpit Web Service...\nJun 10 12:41:48 X.X.X systemd[1]: Started Cockpit Web …Run Code Online (Sandbox Code Playgroud) 当我同时运行多个服务的 systemctl status 时,就像
sudo systemctl status myservice1 myservice2 myservice3
Run Code Online (Sandbox Code Playgroud)
我看到了输出,但最后我看到了
lines 1-48/48 (END)
Run Code Online (Sandbox Code Playgroud)
或者如果参数更多,输出更大
lines 1-62
Run Code Online (Sandbox Code Playgroud)
我可以滚动或分页输出并使用q退出。
是否可以更改此行为,立即打印所有日志输出并退出命令?
我有以下 minikube.service 文件:
\n[Unit]\nDescription=Runs minikube on startup\nAfter=vboxautostart-service.service vboxballoonctrl-service.service vboxdrv.service vboxweb-service.service\n\n[Service]\nType=forking\nExecStart=/usr/local/bin/minikube start\nUser=mark\nGroup=mark\n\n[Install]\nWantedBy=multi-user.target\nRun Code Online (Sandbox Code Playgroud)\n当我从 shell 手动启动它时,它工作正常:
\nmark@minikube-vm:~$ sudo systemctl start minikube.service\nmark@minikube-vm:~$ minikube ip\n192.168.99.100\nmark@minikube-vm:~$ systemctl status minikube.service\n\xe2\x97\x8f minikube.service - Runs minikube on startup\n Loaded: loaded (/etc/systemd/system/minikube.service; enabled; vendor preset: enabled)\n Active: active (running) since Fri 2020-09-25 17:32:48 UTC; 34min ago\n Process: 8388 ExecStart=/usr/local/bin/minikube start (code=exited, status=0/SUCCESS)\n Tasks: 46 (limit: 19141)\n CGroup: /system.slice/minikube.service\n \xe2\x94\x9c\xe2\x94\x808434 /usr/lib/virtualbox/VBoxXPCOMIPCD\n \xe2\x94\x9c\xe2\x94\x808439 /usr/lib/virtualbox/VBoxSVC --auto-shutdown\n \xe2\x94\x9c\xe2\x94\x808618 /usr/lib/virtualbox/VBoxHeadless --comment minikube --startvm 6ec91432-0f09-4fdc-9976-6f736b15c37f --vrde config\n …Run Code Online (Sandbox Code Playgroud) 我创建容器
# debootstrap --variant=minbase --include=systemd,iproute2 buster "/var/lib/machines/test"
Run Code Online (Sandbox Code Playgroud)
然后我运行它:
# systemd-nspawn --machine test
Run Code Online (Sandbox Code Playgroud)
仅用于测试目的。容器启动,当我尝试访问它时,machinectl出现错误:
# machinectl shell test
Failed to get shell PTY: Protocol error
Run Code Online (Sandbox Code Playgroud)
经过一番谷歌搜索后,我意识到有一个旧错误导致了这种行为,但这在systemd v226中得到了修复,并且/usr/bin/systemd --version在我的 debian 上显示了版本 246。
我可以使用“非 systemd 容器”方法进入容器,但是我的容器运行 systemd,我应该能够使用machinectl.
systemd 批准的用于从中删除例如 sidekiq.service 的方法是什么/etc/systemd/system/?
请注意,关于此主题有许多相关讨论,例如我已经阅读过的讨论: https ://superuser.com/questions/513159/how-to-remove-systemd-services
我的困惑之处在于,上述讨论中最常见的答案要求用户rm从多个位置手动文件,但后来的答案表明这systemctl disable <service>应该与手动删除文件具有相同的效果。
根据我自己的测试systemctl disable sidekiq,我发现单元文件之后sidekiq.service仍保留在/etc/systemd/system。
我知道,从理论上讲,rm在一堆位置上使用应该可以解决问题,但我想知道真正熟悉systemd或systemctl会这样做的人是如何做到这一点的。这种暴力真的有必要吗?或者是否有systemctl为此目的的实际命令?
默认情况下,Ubuntu 20.04 焦点上的 systemd (v245),如果我这样做的话systemctl status $THING,并且输出行比我的屏幕长,那么默认分页器(更少?)将进行水平滚动。我宁愿额外的文本位于以下几行(“自动换行”)
我可以设置什么环境变量来将水平滚动更改为“将行的其余部分放在下一行”?
我知道systemctl --no-pager $THINGorsystemctl status $THING | cat在这种情况下会起作用,但每次都需要输入额外的文本。我希望systemctl status $THING始终能够工作而无需添加额外的内容。
我们有许多生产应用程序(第一方和第三方),它们将日志记录留给运行应用程序的进程,而只记录stdoutforINFO和stderrforERROR日志(即只有 2 个日志优先级:)INFO|ERROR。
对于应用程序的 systemd 服务单元,可以这样设置:
StandardOutput=journal
StandardError=journal
Run Code Online (Sandbox Code Playgroud)
这使得 DevOps 可以通过 systemd 单元和日志来管理一切,以便于集中日志收集、监控任何内容……并且他们不需要担心为部署的每个应用程序定位和解析不同格式/位置的不同日志。
systemd 的日志具有与 syslog 的 7 级消息优先级系统兼容的消息优先级系统。 INFO是水平6,ERROR是水平3。有关更多详细信息,请参阅参考资料。
问题是... systemd/journal 显然不区分从 stdout 与 stderr 写入日志的消息。stdout 和 stderr 消息都以默认优先级 6 ( ) 写入日志INFO。
/opt/log-test.shStandardOutput=journal
StandardError=journal
Run Code Online (Sandbox Code Playgroud)
/etc/systemd/system/log-test.service[Unit]
Description=log test for journal
[Service]
Type=simple
ExecStart=/opt/log-test.sh
StandardOutput=journal
StandardError=journal
SyslogIdentifier=log-test
Run Code Online (Sandbox Code Playgroud)
$ systemctl start log-test
$ journalctl -u log-test
-- Logs …Run Code Online (Sandbox Code Playgroud) 现在 RHEL 7 使用 systemd,该ntsysv工具只显示我系统上的一些服务。是否有等效于ntsysv哪个systemd将允许我显示/配置系统上的所有服务?
我只是一个命令行用户,所以我想要一个 TUI。
systemd ×10
linux ×2
bash ×1
boot ×1
containers ×1
debian ×1
fstab ×1
journald ×1
logging ×1
minikube ×1
monitoring ×1
postgresql ×1
rhel7 ×1
terminal ×1
ubuntu ×1