AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1540157
Accepted
gatorback
gatorback
Asked: 2025-02-01 02:56:53 +0800 CST2025-02-01 02:56:53 +0800 CST 2025-02-01 02:56:53 +0800 CST

O script python falha ao iniciar no serviço

  • 772

CONTEXTO

  • Ubuntu 22.04 Desktop: servidor MQTT

  • Objetivo: executar script python (paho com logger) como um serviço

  • A rotina de registro .py testa conforme o esperado (não em um venv):

python3 mqtt2log.py

a linha 6 do script é:import paho.mqtt.client as mqtt

Um arquivo .service é copiado para /etc/system/system:

# run python script as service
# https://unix.stackexchange.com/a/634422/182280e
# copy this .service description to /etc/systemd/system/myscript.service
# /home/user/mqtt2log.py

[Unit]
Description=mqtt2log.py

[Service]
ExecStart=/usr/bin/python3 /home/user/mqtt/mqtt2log.py

[Install]
WantedBy=multi-user.target

OBSERVAÇÕES

ls -l /etc/systemd/system/mqtt2log.serviceretorna:

-rwxrwxrwx 1 root root 314 Jan 11 17:41 /etc/systemd/system/mqtt2log.service

sudo systemctl status mqtt2logretorna:

Jan 31 13:01:30 mqtt systemd[1]: Started mqtt2log.py.
Jan 31 13:01:30 mqtt python3[158388]: Traceback (most recent call last):
Jan 31 13:01:30 mqtt python3[158388]:   File "/home/user/mqtt/mqtt2log.py", line 6, in <module>
Jan 31 13:01:30 mqtt python3[158388]:     import paho.mqtt.client as mqtt
Jan 31 13:01:30 mqtt python3[158388]: ModuleNotFoundError: No module named 'paho'
Jan 31 13:01:30 mqtt systemd[1]: mqtt2log.service: Main process exited, code=exited, status=1/FAILURE
Jan 31 13:01:30 mqtt systemd[1]: mqtt2log.service: Failed with result 'exit-code'.

As mensagens de erro parecem indicar que o módulo paho não pode ser encontrado na linha 6:import paho.mqtt.client as mqtt

QUESTÕES

Erro retornado:ModuleNotFoundError: No module named 'paho'

  1. Por que o módulo paho não foi encontrado?

  2. Que medidas de diagnóstico podem ser tomadas?

Estou intrigado com o fato de que o script python roda a partir da linha de comando. Talvez isso seja de alguma forma um problema de permissões?

MQTT / Paho INSTALAR

sudo apt update
sudo apt-get install mosquitto
sudo vi /etc/mosquitto/mosquitto.conf 
    allow_anonymous true
    listener 1883
sudo systemctl restart mosquitto
sudo apt install python3-pip
pip3 install paho-mqtt
sudo apt install -y mosquitto-clients
22.04
  • 2 2 respostas
  • 103 Views

2 respostas

  • Voted
  1. Best Answer
    Thomas Ward
    2025-02-01T11:37:49+08:002025-02-01T11:37:49+08:00

    O problema é pip. Sua dependência - paho-mqtt- quando instalada via pipsó será instalada no seu espaço de usuário ou em um venvporque não pode gravar no sistema.

    No entanto, devido ao PEP 668 (e somente habilitado no Python 3.12 no Ubuntu 24.04 e posterior, ao que parece, atualmente), pipNÃO será instalado em um ambiente gerenciado externamente (também conhecido como Python do sistema em sistemas Ubuntu). Você pode se deparar com isso, nesse caso você deve criar um dedicado venve então chamar o script Python com o caminho completo para o venvexecutável Python do para que ele saiba qual PYTHON_ROOTusar (o venvdefine isso em tempo de execução)

    Minha sugestão seria criar um dedicado venvpara seu aplicativo e, então, seu sistema chamar o executável Python e o arquivo diretamente com o caminho completo para o executável no venv.

    Por exemplo, se o seu diretório de trabalho para o seu serviço for, /opt/myservice/você faria:

    python3 -m venv /opt/myservice/venv
    source /opt/myservice/venv/bin/activate
    pip3 install paho-mqtt
    

    ... e então na sua linha de execução de serviço (assumindo SystemD), você teria:

    ...
    
    [Service]
    ...
    WorkingDirectory=/opt/myservice
    ExecStart=/opt/myservice/venv/bin/python /opt/myservice/script.py
    ...
    

    e assim chamar diretamente os scripts do serviço, etc. do Python do venv.

    Certifique-se de que a propriedade de todos os arquivos, venvetc., seja do usuário e grupo em que o serviço é executado!


    Se você realmente quiser ignorar o PEP 668 e introduzir os potenciais conflitos de sistema/módulo dos quais as proteções estão intencionalmente tentando protegê-lo , reconheça que você corre o risco de danificar seus pacotes de sistema, etc. ao seguir as próximas instruções. Você aceita todos os riscos em si mesmo ao fazer isso!

    Em versões do Python anteriores à 3.12 no Ubuntu, você pode executar isto para instalar o módulo de sua escolha no nível do sistema:

    sudo pip3 install paho-mqtt
    

    No Python 3.12 e versões posteriores, você precisa fazer isto:

    sudo pip3 install --break-system-packages
    

    Observe que você assume todos os riscos de danificar o Python do seu sistema ou de introduzir conflitos com os pacotes instalados no seu sistema ao fazer isso.

    • 1
  2. waltinator
    2025-02-01T03:49:29+08:002025-02-01T03:49:29+08:00

    Os trabalhos executados por meio de cron(ou scripts de inicialização, ou systemdscripts), não são executados no mesmo ambiente de tempo de execução que você tem em seu desktop. Os scripts de inicialização são executados como root. Nenhuma de suas PATHalterações, ou outras configurações de variáveis ​​de ambiente de ~/.bashrcsão propagadas automaticamente para seu crontrabalho. Por exemplo, não há $DISPLAY, então os programas de GUI precisam de tratamento especial (leia man xhost).

    É possível definir variáveis ​​de ambiente para todos os crontrabalhos no crontabarquivo Read man 5 crontab.

    Veja os resultados de echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";aliasem cada um dos seus ambientes.
    Uma maneira fácil é armazenar os comandos em um bashscript e executá-lo a partir da sua sessão de terminal, salvando a saída, então, executar o script a partir do "outro" ambiente, salvando a saída. Compare as saídas salvas usando diff.

    #!/bin/bash
    echo "=== id ===";id
    echo "=== set ===";set
    echo "=== env ===";env | sort
    echo "=== alias ===";alias`
    

    Como a commandparte da crontablinha é, por padrão, interpretada por /bin/sh, que tem uma sintaxe mais simples que /bin/bash, recomendo que haja commanduma chamada para um bashscript (executável, montado, que começa com #!/bin/bash) que configura o ambiente e, em seguida, chama o programa desejado.

    • -1

relate perguntas

  • Conexão lenta à Internet no Ubuntu 22.04 Beta [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve