LINUX.ORG.RU
ФорумAdmin

python скрипт не запускается через автозагрузку

 


0

1

При запуске вручную из консоли скрипт запускается, но когда я помещаю его в /storage/.config/autostart.sh и перезагружаю систему скрипт не отрабатывает. При этом первая строка с шебангом:

#!/usr/bin/env python3

Пробовал заменить на

#!/usr/bin/python3

не помогло.

При этом

# ls -l /usr/bin/env
lrwxrwxrwx    1 root     root             7 Oct 28 18:52 /usr/bin/env -> busybox

и

# ls -l /usr/bin/python3
lrwxrwxrwx    1 root     root             9 Oct 28 19:05 /usr/bin/python3 -> python3.7

Ответ на: комментарий от anonymous

в консоли удачно

# ./script.py

а в /storage/.config/autostart.sh

(/storage/.config/script.py)&

и пробовал

(python3 /storage/.config/script.py)&

после ребута скрипт не отрабатывает.

zorinquen
() автор топика
Последнее исправление: zorinquen (всего исправлений: 1)
Ответ на: комментарий от zorinquen

еще добавил паузу перед запуском

(
sleep 10
python3 /storage/.config/script.py
)&

не помогло.

zorinquen
() автор топика

скорее всего под рутом не настроено окружение питона… попробуй запустить от юзера скрипт а не от рута.

jo_b1ack ★★★★★
()
Ответ на: комментарий от zorinquen

«руками» (/storage/.config/script.py)& или (python3 /storage/.config/script.py)& отрабатывают? а (./script.py)&

скрипт что делать должен? может он просто «спотыкается» при выполнении в автозагрузке.

anonymous
()
Ответ на: комментарий от jo_b1ack

других юзеров, кроме root и nobody нет в системе, как и команд типа adduser, useradd:

node-1:~ # cat /etc/passwd 
systemd-timesync:x:191:191:systemd-timesync:/:/bin/false
systemd-network:x:193:193:systemd-network:/:/bin/sh
root:x:0:0:Root User:/storage:/bin/sh
nobody:x:65534:65534:Nobody:/:/bin/sh
dbus:x:81:81:System message bus:/:/bin/sh
system:x:430:430:service:/var/run/connman:/bin/sh
avahi:x:495:495:avahi-daemon:/var/run/avahi-daemon:/bin/sh
zorinquen
() автор топика
Ответ на: комментарий от anonymous

нет скрипт не спотыается при выполнении в автозагрузке - вручную он отрабатывает при определенных условиях:

# /storage/.config/script.py 
-sh: /storage/.config/script.py: not found
# ./storage/.config/script.py 
-sh: ./storage/.config/script.py: not found

отрабатывает так

# python3 /storage/.config/script.py 
# (/storage/.config/script.py)&
# -sh: /storage/.config/script.py: not found

отрабатывает

# (python3 /storage/.config/script.py)&

несмотря на то, что скрипт находится в /storage/.config он запускается только через python3 script.py

# cd /storage/.config/
# pwd
/storage/.config
# ls -l script.py 
-rwxr-xr-x    1 root     root           900 Nov 27 16:26 script.py
# (script.py)& 
-sh: node-1:~/.config # script.py: not found
# ./script.py 
-sh: ./script.py: not found

отрабатывает

# python3 script.py

zorinquen
() автор топика
Ответ на: комментарий от zorinquen

Странно, что путь к python3 присутствует в переменной окружения PATH, /usr/bin/python3, но при этом скрипт запускается только через явно указанную команду:

# python3 script.py
zorinquen
() автор топика
Ответ на: комментарий от zorinquen

при явном указании python3 в автозагрузке скрипт срабатывает? и да – /usr/bin/python3 это же линк. я понимаю, что звучит глупо, но факт на лицо.

anonymous
()
Ответ на: комментарий от anonymous

нет, при явном указании python3 в автозагрузке скрипт не срабатывает. Срабатывает только если вручную его запустить. Да /usr/bin/python3 это линк, но на реальный файл /usr/bin/python3.7

# ls -l /usr/bin/python3
lrwxrwxrwx    1 root     root             9 Oct 28 19:05 /usr/bin/python3 -> python3.7

# ls -l /usr/bin/python3.7
-rwxr-xr-x    1 root     root          5732 Oct 28 19:05 /usr/bin/python3.7

zorinquen
() автор топика

А ошибки твой автостарт куда пишет? В сислог? Посмотри, может там что-то полезное. Или можешь stderr питоновского скрипта в файл перенаправить.

Сабшелл не нужен, ты ведь итак отдельный процесс создаёшь, зачем ему ещё шелл?

anonymous
()
Ответ на: комментарий от anonymous

в автостарте указал:

/usr/bin/python3 /storage/.config/script.py &

не помогло.

zorinquen
() автор топика
Ответ на: комментарий от anonymous

файла syslog* в сисетеме не нашел, в списке процессов есть такой:

 2546 dbus      0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only

stderr питоновского скрипта перенаправил в файл, но после ребуту errorz.txt пустой

import sys
sys.stderr = open('/storage/.config/errorz.txt', 'w')

zorinquen
() автор топика
Ответ на: комментарий от zorinquen

Поищи какие-нибудь логи в /var/log или /run/log или почитай документацию к своей системе инициализации, куда она пишет логи.

но после ребуту errorz.txt пустой

Если файл создался из скрипта после ребута, то всё работает.

anonymous
()
Ответ на: комментарий от zorinquen

Когда ты в autostart.sh пишешь круглые скобки, то команда, заключённая в скобки будет выполняться в сабшелле.

anonymous
()
Ответ на: комментарий от anonymous

нет файл errorz.txt не создался из скрипта после ребута, я его через touch предварительно создал. В /var/log только логи Samba:

# ls -la /var/log
total 8
drwxr-xr-x    3 root     root           100 Nov 28 15:09 .
drwxr-xr-x   10 root     root           240 Nov 28 15:10 ..
-rw-r--r--    1 root     root           901 Nov 28 15:10 log.nmbd
-rw-r--r--    1 root     root           506 Nov 28 15:09 log.smbd
drwx------    2 root     root            40 Nov 28 15:09 private

похоже это системный журнал

# ls -la /run/log/journal/48f1a799ac467c205df09fc55caf6b5f
total 1536
drwxr-s---    2 root     systemd-       100 Nov 28 15:09 .
drwxr-sr-x    3 root     systemd-        60 Nov 28 15:09 ..
-rw-r-----    1 root     systemd-    524288 Nov 28 15:15 system.journal
-rw-r-----    1 root     systemd-    524288 Nov 28 15:09 system@1a4226182fbf40249ca3fc1faf3a0836-0000000000000001-0005b52c298ffd57.journal
-rw-r-----    1 root     systemd-    524288 Nov 28 15:09 system@1a4226182fbf40249ca3fc1faf3a0836-00000000000002cb-0005b52c299c4107.journal

нашел в логе такую инфу - модуль pymysql не находит:

Nov 28 15:25:07 node-1 sh[2830]: Traceback (most recent call last):
Nov 28 15:25:07 node-1 sh[2830]:   File "/storage/.config/script.py", line 4, in <module>
Nov 28 15:25:07 node-1 sh[2830]:     import pymysql
Nov 28 15:25:07 node-1 sh[2830]: ModuleNotFoundError: No module named 'pymysql'

хотя он в сиcтеме есть:

# pip install pymysql
Requirement already satisfied: pymysql in ./.opt/lib/python3.8/site-packages (0.10.0)

zorinquen
() автор топика
Последнее исправление: zorinquen (всего исправлений: 3)
Ответ на: комментарий от zorinquen

Добавь в autostart.sh команду

python3 -c "import sys; print(sys.path)" > /storage/.config/python_path.txt
```

И после перезагрузки посмотри, будет ли в файле упоминание пути до `site-packages`, где находится `pymysql`.

Если не будет, то перед вызовом своего скрипта в `autostart.sh` добавь

```
export PYTHONPATH=$PYTHONPATH:/полный/путь/к/site-packages
```
anonymous
()
Ответ на: комментарий от zorinquen

Requirement already satisfied: pymysql in ./.opt/

А, так он у тебя в пользовательскую директорию, что ли установлен? А скрипт ты от рута запускаешь, да? Молодец, чо :)

Добавляй путь до модуля в переменную PYTHONPATH. Или можешь в своём скрипте сделать перед импортом модуля pymysql

import sys

sys.path.append('/путь/к/site-packages')

import pymysql

anonymous
()
Ответ на: комментарий от anonymous

указал

python3 -c "import sys; print(sys.path)" > /storage/.config/python_path.txt

в файле не было упоминания пути до site-packages, где находится pymysql.

Перед вызовом скрипта в autostart.sh добавил

export PYTHONPATH=$PYTHONPATH:/storage/.opt/lib/python3.8/site-packages

теперь в файле python_path.txt появился путь к ../site-packages

['', '/', '/storage/.opt/lib/python3.8/site-packages', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/usr/lib/python3.7/site-packages']

но все равно после ребута скрипт не отрабатывает.

zorinquen
() автор топика
Ответ на: комментарий от zorinquen

Выходит, что всё выполняется, раз ошибок нет. Попробуй от суперпользователя позапускать, может выяснится причина.

$ env -i su root
***
$ cd /storage/.config/
$ python3 script.py
...

Подебажь скрипт, может где-то что-то теряется.

anonymous
()
Ответ на: комментарий от zorinquen

Если скрипт не сложный и если хочешь, то можешь скинуть куда-нибудь на bpaste.net или pastebin.com, я посмотрю в течение полутора часов максимум или завтра.

anonymous
()
Ответ на: комментарий от anonymous
# env -i su root

~ # cd /storage/.config/

~/.config # python3 soft.py 
Traceback (most recent call last):
  File "script.py", line 4, in <module>
    import pymysql
ModuleNotFoundError: No module named 'pymysql'

zorinquen
() автор топика
Ответ на: комментарий от zorinquen

sys.path.append(‘/storage/.opt/lib/python3.8/site-packages’)

Это до импортов надо писать и если ты перед запуском export PYTHONPATH... не делаешь.

fi = open(‘/tmp/port.txt’, «r»)

Не /storage/tmp/script/port.txt?

После выполнения скрипта ты чекаешь базу и там что-то должно меняться? А что? Если port для username не меняется, то и запись не обновится.

Добавь в конец скрипта

print('script.py: Success.', file=sys.stderr)

и после перезагрузки глянь journalctl, должна появиться строка.

cur.execute("UPDATE … «’» …

Сам в этих кавычках не путаешься? :)

cur.execute("UPDATE permissions SET ssh_port=? WHERE userID=?", port, username)
anonymous
()
Ответ на: комментарий от zorinquen

Ну так тут то же самое. Добавь sys.path.append('/storage/.opt/lib/python3.8/site-packages') перед импортами.

anonymous
()
Ответ на: комментарий от anonymous

cur.execute(«UPDATE permissions SET ssh_port=? WHERE userID=?», port, username)

С вопросиками это не точно, конечно. Сейчас смотрю примеры, там %s вместо вопросиков пишут.

anonymous
()
Ответ на: комментарий от anonymous

после ребута выполнил journalctl, строка

cur.execute("UPDATE … «’» …

не появилась в логе.

Скрипт не отработал снова. Может /tmp/port.txt переместить в /storage/…?

zorinquen
() автор топика
Ответ на: комментарий от zorinquen

Блин, если честно, я даже не знаю, что тут может не работать. В файлах при загрузке всегда актуальная инфа? Добавь вывод порта и юзера в лог.

anonymous
()
Ответ на: комментарий от zorinquen

Это когда от суперпользователя с пустым окружением запускаешь? Тогда и в логе после перезагрузки должно появляться.

anonymous
()
Ответ на: комментарий от anonymous

добавил, когда вручную запускаю, появляются верные значения user, port:

 # /storage/.config/script.py 
script.py: Success.
script.py: User: 9751799481, Port: 34027

zorinquen
() автор топика
Ответ на: комментарий от zorinquen

ребутнул, ситуация не поменялась, в логе тишина, хотя в конце скрипта строка присутствует

print(f'script.py: User: {username}, Port: {port}', file=sys.stderr)
zorinquen
() автор топика
Ответ на: комментарий от zorinquen

Когда от суперпользователя? А в базе тоже меняется значение?

Может ещё conn.close() в конец скрипта добавить?

anonymous
()
Ответ на: комментарий от anonymous

добавил

conn.close()

но после ребута тишина, скрипт не отрабатывает, в базе старое значение.

zorinquen
() автор топика
Ответ на: комментарий от zorinquen

хотя при этом в начале скрипта sys.path.append есть к ../site-packages

#!/usr/bin/env python3

import sys
sys.path.append('/storage/.opt/lib/python3.8/site-packages')

import pymysql
zorinquen
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.