명령줄을 통해 완벽하게 실행되지만 systemd ExecStart를 통해서는 작동하지 않습니다.

명령줄을 통해 완벽하게 실행되지만 systemd ExecStart를 통해서는 작동하지 않습니다.

나는 설치했다나비 http 터미널 서버, 내 Arch 머신에서 Python으로 작성되었습니다. 저는 systemd를 처음 사용하는데 명령줄 매개변수 중 하나에 문제가 있습니다.

/usr/bin/butterfly.server.py --shell=/usr/fish --unsecure --host="0.0.0.0"

이는 예상대로 작동하며 다른 컴퓨터의 웹 브라우저를 통해 터미널에 액세스할 수 있습니다.

그러나 간단한 시스템 .service를 생성했을 때:

[Unit]
Description=Butterfly Terminal Server

[Service]
ExecStart=/usr/bin/butterfly.server.py --shell=/bin/fish --host="0.0.0.0" --unsecure

[Install]
WantedBy=multi-user.target

--host="0.0.0.0"ExecStart 줄에서 시작하지 않고 다음을 보고합니다.

[root@ArchHP sockets.target.wants]# systemctl status butterfly.service -l
● butterfly.service - Butterfly Terminal Server
   Loaded: loaded (/usr/lib/systemd/system/butterfly.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Wed 2015-01-07 23:08:29 CST; 26s ago
  Process: 3203 ExecStart=/usr/bin/butterfly.server.py --shell=/bin/fish --host="0.0.0.0" --unsecure (code=exited, status=1/FAILURE)
 Main PID: 3203 (code=exited, status=1/FAILURE)

Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: File "/usr/lib/python3.4/site-packages/tornado/tcpserver.py", line 125, in listen
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: sockets = bind_sockets(port, address=address)
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: File "/usr/lib/python3.4/site-packages/tornado/netutil.py", line 106, in bind_sockets
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: 0, flags)):
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: File "/usr/lib/python3.4/socket.py", line 530, in getaddrinfo
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: socket.gaierror: [Errno -2] Name or service not known
Jan 07 23:08:29 ArchHP systemd[1]: butterfly.service: main process exited, code=exited, status=1/FAILURE
Jan 07 23:08:29 ArchHP systemd[1]: Unit butterfly.service entered failed state.
Jan 07 23:08:29 ArchHP systemd[1]: butterfly.service failed.

그런 다음 을 제거하면 --host="0.0.0.0"성공적으로 시작되지만 내 로컬 컴퓨터에서만 액세스할 수 있습니다. 다른 컴퓨터에는 액세스 권한이 부여되지 않습니다. 그런 다음 서비스에 대한 Butterfly.socket을 만들려고 시도했지만 오류 메시지를 찾는 데 성공하지 못했습니다.

ExecStart를 통해 실행하는 것이 명령줄에서 실행하는 것과 다른 이유는 무엇이며, 해당 매개변수를 사용하여 어떻게 시작합니까? 최후의 수단으로 python 스크립트를 수정하여 기본값을 로 설정할 수 있지만 직접 실행할 때는 0.0.0.0오류가 발생하지만 오류가 발생하지 않는 이유를 알고 싶습니다 .sudo systemctl restart butterfly.service

답변1

쉘에서 나비를 시작하면 주위의 따옴표가 제거됩니다 0.0.0.0. 반면에 systemd는 쉘이 아니기 때문에 이 상황에서 인용 확장을 수행하지 않습니다.

실제로 systemd는 따옴표를 제거할 수 있습니다.논쟁이 있지만 중간에 있지는 않습니다.

따라서 0.0.0.0서비스 파일 주변의 따옴표를 제거하고 변경 사항을 확인하십시오. 을 잊지 마세요 systemctl daemon-reload.

추신: .socket 유닛을 작성하는 것만으로는 마법처럼 데몬 소켓을 활성화할 수 없습니다. 소켓 활성화를 지원하려면 해당 코드를 변경해야 합니다.

답변2

을(를) 실행하기 위한 몇 가지 종속성이 있는 것 같습니다 butterfly.service. 명령줄에서 실행하는 동안 모든 서비스가 작동 중일 수 있으며 문제가 발생하지 않을 수 있지만 처음부터 시작하는 동안 systemd일부 종속성 서비스가 작동되지 않고 해당 서비스가 작동하기 전에 발생할 수 your butterfly.service있습니다. 그리고 섹션 Restart=always에 추가하여 [service]충돌이 발생하면 다시 시작해야 합니다.

관련 정보