로드에 실패한 서비스를 디버깅할 때 사람들이 수행하려는 일반적인 작업은 서비스가 마지막으로 시작된 시간의 모든 로그를 보는 것입니다.
예를 들어, 주어진
Jul 25 08:18:20 raspberrypi ngrok[3105]: Incorrect Usage: flag provided but not defined: -log
Jul 25 08:20:04 raspberrypi systemd[1]: [email protected] holdoff time over, scheduling restart.
Jul 25 08:20:04 raspberrypi systemd[1]: Stopping Share local port(s) with ngrok...
Jul 25 08:20:04 raspberrypi systemd[1]: Starting Share local port(s) with ngrok...
Jul 25 08:20:04 raspberrypi systemd[1]: Started Share local port(s) with ngrok.
Jul 25 08:20:04 raspberrypi ngrok[5474]: t=2016-07-25T08:20:04+0000 lvl=warn msg="failed to get home directory, using $HOME instead" err="user: Current not implemented on linux/arm" $HOME=
Jul 25 08:20:04 raspberrypi ngrok[5474]: Failed to open log file '/dev/stdout': open /dev/stdout: no such device or address
이후의 모든 대사를 보고 싶습니다 Jul 25 08:20:04 raspberrypi systemd[1]: Starting Share local port...
.
와 유사 journalctl --boot
하지만 마지막으로 서비스가 시작된 시간부터 시작됩니다.
그게 가능합니까?
마찬가지로 --list-boots
systemctl이 서비스를 시작하거나 중지하는 모든 시간을 나열하는 것과 같은 기능을 사용하면 내가 journalctl --last-start -u svc
원하는 동작을 모방할 수 있습니다.
답변1
안타깝게도 이 기능은 현재 지원되지 않습니다. 바라보다https://github.com/systemd/systemd/issues/1942
GitHub 사용자늑대 남편 스크립트를 게시했습니다매우 가까운 질문에서 :
#!/bin/bash
#
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
# Timestamp when unit transitioned from inactive to active
since=$(systemctl show -p InactiveExitTimestamp "$1" | cut -f 2 -d '=' | cut -f 2-3 -d' ')
# or one minute if unset
since=${since:-1 min ago}
# Get prefix string that this units logs with: most robust
# https://github.com/systemd/systemd/issues/2913#issuecomment-219702148
id=$(systemctl show -p SyslogIdentifier "$1" | cut -f 2 -d '=')
# Get all raw output from unit since start, only from stdout&stderr
# Considering that backend only logs "bad" stack traces to stderr, this should
# always be relevant
service_trace=$(journalctl -o cat --since "$since" -t "$id")
답변2
다음과 같은이 답변, systemd 232부터 systemd를 사용할 수 있습니다INVOCATION_ID
, 이는 특정 ID입니다.달리기서비스. 이것이 내가 사용하는 것입니다:
function last_log() {
if [ $# == 1 ] then
echo -e "\nSyntax: $0 SERVICE_NAME"
exit 1
fi
ID=$(systemctl show -p InvocationID --value $1)
journalctl INVOCATION_ID=$ID + _SYSTEMD_INVOCATION_ID=$ID
}
잘못된 서비스 이름을 제공하면 일관되지 않은 동작이 발생하고 명령줄 완성의 이점을 잃게 됩니다.
답변3
마지막 서비스 시작 로그를 얻는 가장 쉬운 방법은 Journalctl이 아니라 systemctl status입니다.
sudo systemctl status --no-pager -l -n 99999 svc
1시간 전과 같이 Journalctl의 시작 시간을 지정할 수도 있습니다.
sudo journalctl --no-pager --since='-1h' -u svc
또는 특정 시간부터 시작: --since='16:00'
.