![명령줄을 통해 완벽하게 실행되지만 systemd ExecStart를 통해서는 작동하지 않습니다.](https://rvso.com/image/36000/%EB%AA%85%EB%A0%B9%EC%A4%84%EC%9D%84%20%ED%86%B5%ED%95%B4%20%EC%99%84%EB%B2%BD%ED%95%98%EA%B2%8C%20%EC%8B%A4%ED%96%89%EB%90%98%EC%A7%80%EB%A7%8C%20systemd%20ExecStart%EB%A5%BC%20%ED%86%B5%ED%95%B4%EC%84%9C%EB%8A%94%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
나는 설치했다나비 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]
충돌이 발생하면 다시 시작해야 합니다.