시작 또는 종료 중에 실행되는 Python 스크립트에서 이름 확인이 일시적으로 실패합니다.

시작 또는 종료 중에 실행되는 Python 스크립트에서 이름 확인이 일시적으로 실패합니다.

Telegram을 통해 메시지를 보내는 Python 스크립트를 작성했습니다.

#!/opt/anaconda3/bin/python

import asyncio
import telegram
import os
import sys


async def main():
    bot = telegram.Bot(os.environ["TELEGRAM_TOKEN"])
    async with bot:

        #print(await bot.get_me())
        #print((await bot.get_updates())[0])
        await bot.send_message(text=' '.join(sys.argv[1:]), chat_id=MYCHATID)


if __name__ == '__main__':
    asyncio.run(main())

TELEGRAM_TOKEN설정이 하드코딩 /etc/environment되어 MYCHATID있습니다.

이를 실행하기 위해 두 개의 스크립트를 만들었습니다.

# cat /etc/init.d/sendbot_boot.sh
#!/bin/bash

/opt/anaconda3/bin/python /usr/local/bin/sendbot "Booting..."

# cat /etc/init.d/sendbot_shutdown.sh
#!/bin/bash

/opt/anaconda3/bin/python /usr/local/bin/sendbot "Shutting down..."

다음 중 하나를 추가하세요.cron

# cat /var/spool/cron/crontabs/root
@reboot /etc/init.d/sendbot_boot.sh

또 다른 사람이 도착하고 있습니다 rc6.

# ls -l /etc/rc6.d/K99sendbot_shutdown
lrwxrwxrwx 1 root root 29 фев 10 02:08 /etc/rc6.d/K99sendbot_shutdown -> ../init.d/sendbot_shutdown.sh

모든 스크립트는 실행 가능하며 터미널에서 실행할 때 제대로 실행됩니다. 그러나 그 중 어느 것도 실제 재부팅에서는 작동하지 않습니다.

내가 뭘 잘못했나요?

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.6 LTS
Release:        18.04
Codename:       bionic

오류 출력을 확인하고 다음을 얻었습니다.

Traceback (most recent call last):
  File "/opt/anaconda3/lib/python3.8/site-packages/httpcore/_exceptions.py", line 10, in map_exceptions
    yield
  File "/opt/anaconda3/lib/python3.8/site-packages/httpcore/backends/asyncio.py", line 111, in connect_tcp
    stream: anyio.abc.ByteStream = await anyio.connect_tcp(
  File "/opt/anaconda3/lib/python3.8/site-packages/anyio/_core/_sockets.py", line 189, in connect_tcp
    gai_res = await getaddrinfo(
  File "/opt/anaconda3/lib/python3.8/site-packages/anyio/_core/_sockets.py", line 496, in getaddrinfo
    gai_res = await get_asynclib().getaddrinfo(
  File "/opt/anaconda3/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 1754, in getaddrinfo
    result = await get_running_loop().getaddrinfo(
  File "/opt/anaconda3/lib/python3.8/asyncio/base_events.py", line 825, in getaddrinfo
    return await self.run_in_executor(
  File "/opt/anaconda3/lib/python3.8/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/opt/anaconda3/lib/python3.8/socket.py", line 918, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -3] Temporary failure in name resolution

답변1

재부팅 시 스크립트가 올바르게 실행되지 않는 것 같습니다. Ubuntu 18.04에서 /etc/rcX.d/ 디렉토리의 시스템 서비스 및 스크립트는 프로그램에 의해 실행됩니다 /sbin/runlevel. 의 초기화 스크립트는 직접 실행할 수 있지만 부팅 시 또는 런레벨 변경 시 실행하려면 /etc/init.d/적절한 디렉터리에 연결해야 합니다 ./etc/rcX.d/

다음 명령을 사용하여 적절한 rcX.d 디렉토리에 init 스크립트에 대한 심볼릭 링크를 만들어 보십시오:

sudo ln -s /etc/init.d/sendbot_boot.sh /etc/rc2.d/S99sendbot_boot
sudo ln -s /etc/init.d/sendbot_shutdown.sh /etc/rc0.d/K99sendbot_shutdown

이렇게 하면 시작 및 종료 시 스크립트가 실행됩니다.

추신: Ubuntu를 업데이트해 보세요 :-)

관련 정보