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)
Ответ на: комментарий от 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 ()
Ответ на: комментарий от 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

файла 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 ()
Ответ на: комментарий от 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

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 ()
Ответ на: комментарий от anonymous

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

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

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

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

anonymous ()