저는 최신 업데이트가 포함된 Debian Jessie를 사용하고 있습니다. 서버가 시작될 때 스크립트를 실행하기 위해 systemd 서비스를 만들었습니다. 구성은 다음과 같습니다.
[Unit]
Description=(my description)
[Service]
ExecStart=/usr/bin/bot
Restart=restart-always
[Install]
WantedBy=multi-user.target
/usr/bin/bot
Mono 실행 파일을 실행하는 스크립트입니다. 여기에는 다음이 포함됩니다:
#!/bin/bash
(cd /path/to/my/executable && mono bot.exe)
(여기서 경로를 바꿨는데 스크립트의 경로가 정확합니다.)
/usr/bin/bot
스크립트를 정상적으로(내 터미널에서만) 실행하면 /usr/bin/bot
예상대로 작동합니다. top
CPU의 0~20%를 사용한다고 보고하며 이는 정상적인 현상입니다. 그런데 로 시작하면 service bot start
항상 top
CPU를 100% 이상 사용한다고 나옵니다.
두 경우 모두 bot
예상대로 작동합니다 .
CPU 사용량의 이렇게 큰 차이를 어떻게 설명할 수 있습니까?
감사해요.
답변1
문제는 systemd에 있지 않습니다.
Systemd는 표준 입력(=/dev/null) 없이 프로세스를 실행합니다. 모든 시스템 호출은 read()
즉시 완료됩니다(일반 표준 입력을 사용하고 read()
새 데이터가 도착할 때까지 차단됩니다). 일반적으로 read()
완료되지 않은 루프를 호출하면 엄청난 CPU 사용량이 발생합니다. 이를 확인하려면 실행 중인 프로세스에 연결을 사용해 보십시오 strace -p <pid>
.
프로세스는 표준 입력 없이 실행되도록 조정하거나 제안된 screen
명령과 같은 일부 래퍼를 사용해야 합니다.nohup
답변2
bot
screen
나는 다음과 같이 내 것을 아래에 넣어 "고정"했습니다 .
[Unit]
Description=(my description)
[Service]
RemainAfterExit=yes
ExecStart=/usr/bin/screen -dmS bot /usr/bin/bot
Restart=restart-always
[Install]
WantedBy=multi-user.target
내 프로세스를 화면에 표시하면 높은 CPU 사용량이 해결된 이유는 모르겠지만, 작동했습니다.
답변3
@niziak의 솔루션에 따르면 입력이 차단됩니다. 제 경우에는 StandardInput=tty
[서비스]를 추가해서 해결되었습니다. 출력을 /dev/tty12의 (사용되지 않은) 콘솔로 리디렉션했습니다.
내 [서비스] 섹션:
[Service]
ExecStart=/usr/local/bin/vtclock -1 -c| -f /tmp/ntpstatus
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=simple
User=vtclock
StandardInput=tty
StandardOutput=tty
StandardError=null
TTYPath=/dev/tty12
(OS = Ubuntu 16.04.3 LTS, systemd 서비스를 처음 시도했습니다)
답변4
C#/.NET Core에서 콘솔 애플리케이션을 개발한 경우 다음을 사용하여 콘솔을 계속 실행하지 마세요.
Console.Read();
Linux에서 시스템 서비스로 애플리케이션을 실행하면 CPU 사용량이 100%가 되기 때문입니다.
대신 다음을 사용하십시오.
while (true) { Console.ReadKey(); }
나는 같은 문제를 가지고있다.