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
# journalctl | grep -C10 script
Nov 28 20:03:41 node-1 kernel: IR RC6 protocol handler initialized
Nov 28 20:03:41 node-1 kernel: IR Sony protocol handler initialized
Nov 28 20:03:41 node-1 kernel: meson-ir c8100580.meson-ir: receiver initialized
Nov 28 20:03:41 node-1 kernel: IR SANYO protocol handler initialized
Nov 28 20:03:41 node-1 systemd[1]: remote-config.service: Succeeded.
Nov 28 20:03:41 node-1 systemd[1]: Started IR remote control support.
Nov 28 20:03:41 node-1 systemd[1]: Reached target Graphical Interface.
Nov 28 20:03:41 node-1 kernel: input: MCE IR Keyboard/Mouse (meson-ir) as /devices/virtual/input/input3
Nov 28 20:03:41 node-1 kernel: IR MCE Keyboard/mouse protocol handler initialized
Nov 28 20:03:41 node-1 kernel: lirc_dev: IR Remote Control driver registered, major 229 
Nov 28 20:03:41 node-1 systemd[1]: Starting Kodi user autostart script...
Nov 28 20:03:41 node-1 systemd[1]: Started aml-vnc.
Nov 28 20:03:41 node-1 kernel: rc rc0: lirc_dev: driver ir-lirc-codec (meson-ir) registered at minor = 0
Nov 28 20:03:41 node-1 kernel: IR LIRC bridge handler initialized
Nov 28 20:03:41 node-1 smbd[2794]: [2020/11/28 20:03:41.601317,  0] ../source3/passdb/pdb_smbpasswd.c:249(startsmbfilepwent)
Nov 28 20:03:41 node-1 smbd[2794]:   startsmbfilepwent_internal: file /run/samba/smbpasswd did not exist. File successfully created.
Nov 28 20:03:41 node-1 smbd[2794]: [2020/11/28 20:03:41.636695,  0] ../lib/util/become_daemon.c:136(daemon_ready)
Nov 28 20:03:41 node-1 smbd[2794]:   daemon_ready: daemon 'smbd' finished starting up and ready to serve connections
Nov 28 20:03:41 node-1 kernel: libphy: stmmac-0:08 - Link is Up - 100/Full
Nov 28 20:03:41 node-1 sh[2831]: 28/11/2020 20:03:41 Unable to establish connection with systemd socket
Nov 28 20:03:41 node-1 sh[2831]: 28/11/2020 20:03:41 Listening for VNC connections on TCP port 5900
Nov 28 20:03:41 node-1 sh[2831]: 28/11/2020 20:03:41 Listening for VNC connections on TCP6 port 5900
Nov 28 20:03:41 node-1 kernel: input: VNCServer SimKey as /devices/virtual/input/input4
Nov 28 20:03:41 node-1 systemd-logind[2545]: Watching system buttons on /dev/input/event3 (MCE IR Keyboard/Mouse (meson-ir))
Nov 28 20:03:41 node-1 systemd-logind[2545]: Watching system buttons on /dev/input/event2 (meson-ir)
Nov 28 20:03:41 node-1 systemd-logind[2545]: Watching system buttons on /dev/input/event4 (VNCServer SimKey)
Nov 28 20:03:44 node-1 kernel: --------------ssv6200_sw_scan_start(): 
Nov 28 20:03:45 node-1 systemd[1]: Started Kodi user autostart script.
Nov 28 20:03:45 node-1 systemd[1]: Starting Kodi Media Center...
Nov 28 20:03:45 node-1 systemd[1]: Started OpenVFD Service.
Nov 28 20:03:45 node-1 aml-wait-for-dispcap.sh[2853]: Display not ready. No disp_cap.
Nov 28 20:03:45 node-1 kernel: ==============ssv6200_sw_scan_complete(): 
Nov 28 20:03:47 node-1 avahi-daemon[2683]: Joining mDNS multicast group on interface eth0.IPv4 with address 192.168.1.4.
Nov 28 20:03:47 node-1 avahi-daemon[2683]: New relevant interface eth0.IPv4 for mDNS.
Nov 28 20:03:47 node-1 avahi-daemon[2683]: Registering new address record for 192.168.1.4 on eth0.IPv4.
Nov 28 20:03:47 node-1 connmand[2662]: eth0 {add} address 192.168.1.4/24 label eth0 family 2
Nov 28 20:03:47 node-1 connmand[2662]: eth0 {add} route 192.168.1.0 gw 0.0.0.0 scope 253 <LINK>
Nov 28 20:03:47 node-1 connmand[2662]: eth0 {add} route 192.168.1.1 gw 0.0.0.0 scope 253 <LINK>

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

в логе есть, но когда полностью journalctl без ключа C10.

Ок, спс за помощь, может утро вечера мудренее и завтра получится победить сабж.

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

Вероятно глупость предложу, но может через login shell его запустить в автозапуске? Помнится, когда-то мне с чем-то помогло.

Попробуй в своём autostart.sh

bash -lc 'cd /storage/.config/ && python3 script.py'

(либо sh, смотря есть ли у тебя там bash)

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

Жаль. А второй python в этой системе стоит? Может pip не для той версии ставит? Глянь что выводит сейчас в загруженной консоли:

  • which pip
  • which pip3
  • env | grep VIRTUAL_ENV

Попробуй ещё

-v
Print a message each time a module is initialized, showing the  place (filename or built-in module) from which it is loaded. When given twice (-vv), print a message for each file that is checked for when searching for a module. Also provides information on module cleanup at exit. See also PYTHONVERBOSE.

То бишь python -vv вместо python. И глянуть лог.

Капец, где все те суперкрутые питонисты, девопсы лора за $100’500/sec? Молчат как рыбы. Я даже не питонист.

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

Ну как-то странно, что только часть (одна строка) бэктрейса в лог попадает.

Давай так. В /storage/.config/autostart.sh вызови скрипт такой строкой:

python3 /storage/.config/script.py &> /storage/.config/script.log &

После перезагрузки посмотри script.log.

anonymous
()
Ответ на: комментарий от anonymous
# which pip
/opt/bin/pip
# which pip3
/opt/bin/pip3

такой переменной нет

# env | grep VIRTUAL_ENV

добавил в скрипт python3 -vv, но после ребута та же ошибка в логе на строку import mysql.

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

суперкрутые питонисты просто в воскресенье отдыхают после жёстких овертаймов на джобе))

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

в /storage/.config/script.log такое появилось

# cat /storage/.config/script.log 
Traceback (most recent call last):
  File "/storage/.config/sсript.py", line 9, in <module>
    import pymysql
ImportError: bad magic number in 'pymysql': b'U\r\r\n'

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

bad magic number

Проблема получается в том, что модуль до вызова скрипта импортировался второй версией питона и в кеше питона теперь скомпилированный модуль для второй версии, которую ошибочно пытается подгрузить третья. Может права на запись не дают переписать кеш. Я не знаю как это по-нормальному исправить. Удалять кеш питона каждый раз, наверное, не очень правильно.

Возможно лучше будет установить pymysql и другие необходимые модули для рута и импортировать их обычным образом, убрав sys.path.append('/storage/.opt/lib/python3.8/site-packages') из скрипта.

Можно, конечно, попробовать удалять только файлы кеша, типа:

find /storage/.opt/lib/python3.8/site-packages -name 'pymysql*.pyc' -delete

но, скорее всего, эта ошибка и с другими модулями будет: с cryptography и settings. Просто pymysql сейчас первый стоит, вот на нём и спотыкается.

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

Но ты сначала попробуй просто вручную кеш удалить и перезагрузиться, может поможет. Можешь из обоих путей кеш почистить:

find /storage/.opt/lib/python3.8/site-packages -name '*.pyc' -delete

find /storage/.config -name '*.pyc' -delete
anonymous
()
Ответ на: комментарий от zorinquen

/usr/lib/python3.7/site-packages

/storage/.opt/lib/python3.8/site-packages

У тебя, видимо, стоит питон версии 3.7, а модули ты загружаешь скомпилированные для 3.8. Может быть тогда вместо удаления просто обновить питон до 3.8?

anonymous
()

да уж...

вот смотри, безотносительно к корректности самого скрипта(оставим на совести пейсателя). Если вручную, в консоли ты его запускаешь, он отрабатывает,так? Допустим отрабатывает так, как задумано, всё в ёлочку. Тогда, для того, чтобы штатный autostart в linux это хозяйство запустил, тебе нужно сделать всего две вещи:

1) дай этому скрипту права на запуск, ну там chmod +x script.py, и закинь его в PATH - /bin /usr/bin или /yjme/matherfaker/.choo/bin, не важно, туда, где голая, системная PATH гарантированно вернёт тебе его положение.

2) в том месте, где autostart штатно(для твоего случая) что-то там запускает, вопрос конечно, как оно там у тебя устроено, но не важно, то, что должно запускать, запускать этот скрипт должно командой : exec=script.py .

Как пример приведу пример автостарта при логине в учётную запись:

в ~/.config/autostart создаёшь файл myscript.desktop с такими строчками:

[Desktop Entry]
Exec=script.py

понятно что у тебя другие условия, я привёл пример, как это должно работать.

Gramozeka ★★
()
Ответ на: комментарий от zorinquen
# ls -l /usr/bin/python*
lrwxrwxrwx    1 root     root             7 Oct 28 19:01 /usr/bin/python -> python2
lrwxrwxrwx    1 root     root             9 Oct 28 19:01 /usr/bin/python2 -> python2.7
-rwxr-xr-x    1 root     root          5732 Oct 28 19:01 /usr/bin/python2.7
lrwxrwxrwx    1 root     root             9 Oct 28 19:05 /usr/bin/python3 -> python3.7
-rwxr-xr-x    1 root     root          5732 Oct 28 19:05 /usr/bin/python3.7
zorinquen
() автор топика
Ответ на: комментарий от zorinquen

т.е. достаточно будет выполнить пункт 1)

читай внимательно - пункт 2. Автозапускалка должна получить на вход : exec=myscript.py

Gramozeka ★★
()
Ответ на: комментарий от zorinquen
-rwxr-xr-x    1 root     root          6144 Sep  3 13:23 /opt/bin/python3.8
-rwxr-xr-x    1 root     root          3302 Sep  3 13:23 /opt/bin/python3.8-config
zorinquen
() автор топика
Ответ на: комментарий от Gramozeka

т.е. если у меня autostart.sh - это shell скрипт, то нужно для запуска:

exec /opt/bin/python3.8 /storage/.config/script.py &> /storage/.config/script.log &

?

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

т.е. если у меня autostart.sh - это shell скрипт, то нужно для запуска:

))) ты меня радуешь...

если всё я понял правильно, то запускать тебе нужно как-то так

exec /storage/.config/script.py &> /storage/.config/script.log &
т.к. скрипт уже исполняемый, и в нём, в шапке вписан интерпретатор запуска(ака #!/opt/bin/python3.8 ), тебе его указывать не нужно, скрипт(точнее шелл в котором ты его пускаешь) сам дёрнет питона в тех декорациях, которые указаны в скрипте.

Gramozeka ★★
()
Ответ на: комментарий от anonymous
# cat /storage/.config/script.log 
Traceback (most recent call last):
  File "/storage/.config/script.py", line 15, in <module>
    cipher = Fernet(cipher_key)
  File "/opt/lib/python3.8/site-packages/cryptography/fernet.py", line 32, in __init__
    backend = _get_backend(backend)
  File "/opt/lib/python3.8/site-packages/cryptography/hazmat/backends/__init__.py", line 24, in _get_backend
    return default_backend()
  File "/opt/lib/python3.8/site-packages/cryptography/hazmat/backends/__init__.py", line 15, in default_backend
    from cryptography.hazmat.backends.openssl.backend import backend
  File "/opt/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/__init__.py", line 7, in <module>
    from cryptography.hazmat.backends.openssl.backend import backend
  File "/opt/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 117, in <module>
    from cryptography.hazmat.bindings.openssl import binding
  File "/opt/lib/python3.8/site-packages/cryptography/hazmat/bindings/openssl/binding.py", line 202, in <module>
    _verify_package_version(cryptography.__version__)
  File "/opt/lib/python3.8/site-packages/cryptography/hazmat/bindings/openssl/binding.py", line 191, in _verify_package_version
    raise ImportError(
ImportError: The version of cryptography does not match the loaded shared object. This can happen if you have multiple copies of cryptography installed in your Python path. Please try creating a new virtual environment to resolve this issue. Loaded python version: 3.1.1, shared object version: b'3.1'
zorinquen
() автор топика
Ответ на: комментарий от zorinquen

вот и получается, у тебя автозапускалка сперва запускает голого питона (/opt/bin/python3.8), а потом сам скрипт, уже находясь в питоне, этот же питон снова вызывает. Тебе нужны тутошние питонисты, они подробней разжуют.

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

ты не читая отвечаешь? Я вроде по русски написал:

Как пример приведу пример автостарта при логине в учётную запись:

или чего? В шелле запуска, без логинов и прочего, надо явно указывать что ты хочешь от команды - запустить её, или просто напечатать её как текстовый мусор ака «вы входите... входите...», или это объява переменной, или ещё какая петрушка.

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

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

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

даёшЪ буратинизацию всея страны!

А так могёте, красавчики чё.

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

Надо распутывать клубок этих питонячьих версий. Где для какой какие библиотеки установлены, какая откуда запускается, берутся ли они из virtualenv…

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

Ну может создать тогда?

https://docs.python.org/3/tutorial/venv.html

https://docs.python.org/3/library/venv.html#module-venv

The venv module provides support for creating lightweight “virtual environments” with their own site directories, optionally isolated from system site directories. 
Each virtual environment has its own Python binary (which matches the version of the binary that was used to create this environment) and can have its own independent set of installed Python packages in its site directories.

Звучит как то что надо, а то как с этим всем разобраться. И поставить там уже либы. Создавай /opt/bin/python3.8 питоном.

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

т.е. поудалять все относящиеся к python пакеты из Entware:

# opkg list-installed | grep python3
python-pip-conf - 0.1-1
python3 - 3.8.5-2
python3-asyncio - 3.8.5-2
python3-base - 3.8.5-2
python3-cffi - 1.14.2-1
python3-cgi - 3.8.5-2
python3-cgitb - 3.8.5-2
python3-codecs - 3.8.5-2
python3-cryptography - 3.1-2
python3-ctypes - 3.8.5-2
python3-curl - 7.43.0.5-2
python3-dbm - 3.8.5-2
python3-decimal - 3.8.5-2
python3-dev - 3.8.5-2
python3-distutils - 3.8.5-2
python3-email - 3.8.5-2
python3-gdbm - 3.8.5-2
python3-lib2to3 - 3.8.5-2
python3-light - 3.8.5-2
python3-logging - 3.8.5-2
python3-lzma - 3.8.5-2
python3-multiprocessing - 3.8.5-2
python3-ncurses - 3.8.5-2
python3-openssl - 3.8.5-2
python3-pip - 20.1.1-1
python3-pkg-resources - 47.1.0-1
python3-ply - 3.11-2
python3-pycparser - 2.20-5
python3-pydoc - 3.8.5-2
python3-pymysql - 0.10.0-1
python3-setuptools - 47.1.0-1
python3-six - 1.15.0-1
python3-sqlite3 - 3.8.5-2
python3-unittest - 3.8.5-2
python3-urllib - 3.8.5-2
python3-xml - 3.8.5-2

и в /opt/bin установить virtualenv?

zorinquen
() автор топика
Ответ на: комментарий от zorinquen
# python3.8 -m venv /opt/python-new
Error: Command '['/opt/python-new/bin/python3.8', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.

но каталоги создались

total 4
drwxr-xr-x    2 root     root          1024 Nov 29 12:26 bin
drwxr-xr-x    2 root     root          1024 Nov 29 12:26 include
drwxr-xr-x    3 root     root          1024 Nov 29 12:26 lib
lrwxrwxrwx    1 root     root             3 Nov 29 12:26 lib64 -> lib
-rw-r--r--    1 root     root            69 Nov 29 12:26 pyvenv.cfg


# du -hs /opt/bin/python-new/
7.0K	/opt/bin/python-new/
zorinquen
() автор топика
Ответ на: комментарий от zorinquen

Не надо пока ничего удалять. А то ещё не останется рабочей версии питона.

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

А если от рута просто попробовать поставить pymysql и cryptography с дефолтным pip? И потом убрать sys.path.append('/storage/.opt/lib/python3.8/site-packages') из скрипта?

anonymous
()
Ответ на: комментарий от anonymous
# pip --version
pip 20.2.4 from /opt/lib/python3.8/site-packages/pip (python 3.8)

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

# pip install cryptography
Requirement already satisfied: cryptography in ./.opt/lib/python3.8/site-packages (3.1)
Requirement already satisfied: cffi!=1.11.3,>=1.8 in ./.opt/lib/python3.8/site-packages (from cryptography) (1.14.3)
Requirement already satisfied: six>=1.4.1 in ./.opt/lib/python3.8/site-packages (from cryptography) (1.15.0)
Requirement already satisfied: pycparser in ./.opt/lib/python3.8/site-packages (from cffi!=1.11.3,>=1.8->cryptography) (2.20)

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

Тут всего один пользователь, рут и есть. Путаница предположительно из-за версий питона. При загрузке исполняется какая-то другая.

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