나는 설치했다나비 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]