Mysql разветвленный процесс не может создавать новые файлы - PullRequest
0 голосов
/ 27 июня 2019

Я не уверен, ясно ли имя этого вопроса или нет, не стесняйтесь редактировать его.

Я пытаюсь запустить скрипт на python внутри mysql, используя UDF.Источник UDF, который я использую, можно найти здесь .

Этот UDF предоставляет функцию mysql sys_eval(), которую вы используете для запуска команды.

Сначала я расскажу вам, как я справился со своей проблемой.

После настройки UDF я запустил простую тестовую команду в mysql:

select sys_eval('whoami');
> mysql

Хорошо, это работаети пользователь, как и ожидалось.Теперь давайте запустим тестовый скрипт на Python.

/ var / lib / mysql / scripts / test.py

print("success!")

Запуск скрипта в mysql:

select sys_eval('python3 /var/lib/mysql/scripts/test.py');
> success!

Отлично.Здесь нет проблем.Теперь пришло время запустить настоящий скрипт.

/ var / lib / mysql / scripts / queue_update.py

import sys
import json
import os

create_path = "/tmp/mysql_updates/temp/"
filename_begin = "ip_username_update_"
filename_end = ".upd"
move_path = "/tmp/mysql_updates/"

def create_filename():
    # Generate random id
    rnd_id = uuid.uuid4()
    return filename_begin + str(rnd_id) + filename_end


def open_file(filename):
    return os.open(path=create_path + filename, flags=(os.O_CREAT | os.O_APPEND | os.O_WRONLY | os.O_EXCL))


if __name__ == '__main__':
    json_dict = {}
    json_dict['type'] = "test"
    json_string = json.dumps(json_dict)

    while True:
        try:
            filename = create_filename()
            fd = open_file(filename)

            os.write(fd, bytearray(json_string, 'utf-8'))
            os.close(fd)
            os.rename(create_path + filename, move_path + filename)
            break
        except FileExistsError as e:
            continue  # Make a new filename and try again
        except Exception as e:
            print("caught random except")
            print(e)
            break

Этот скрипт довольно прост.Сначала он генерирует uuid и создает с ним имя файла.

Затем он записывает строку json в файл в /tmp/mysql_updates/temp, используя сгенерированное имя файла.Если имя файла уже используется, оно генерирует новое имя файла и повторяет попытку до тех пор, пока не будет создано уникальное имя файла.

После того, как файл был создан и записан, он перемещается в /tmp/mysql_updates/

Теперь давайте сначала проверим этот сценарий, потому что писать вопрос здесь, не задавая его сначала, было бы глупо.

[root@localhost scripts]# python3 queue_update.py
[root@localhost scripts]# ls /tmp/mysql_updates/
ip_username_update_c8849c0b-e774-4a87-acfb-0b06b8499970.upd  temp

Отлично, это работает, как и ожидалось.Теперь, прежде чем выполнить это на mysql, давайте удостоверимся, что у пользователя и группы mysql есть разрешения на то, что они хотят с каталогами /tmp/mysql_updates/ и /tmp/mysql_updates/temp/.

[root@localhost scripts]# rm -f /tmp/mysql_updates/ip_username_update_c8849c0b-e774-4a87-acfb-0b06b8499970.upd
[root@localhost scripts]# ls -la /tmp/mysql_updates/
drwxrwxrwx.  3 mysql mysql   83 Jun 27 14:03 .
drwxrwxrwt. 11 root  root  4096 Jun 27 13:32 ..
drwxrwxrwx.  2 mysql mysql    6 Jun 27 13:59 temp

Наконец, давайте выполним скрипт вmysql:

select sys_eval('/var/lib/mysql/scripts/queue_update.py');
> caught random execpt
[Errno 13] Permission denied: '/tmp/mysql_updates/temp/ip_username_update_7f5f471b-717a-43cd-959a-d6b5f199fb6e.upd'

Как видите, при попытке создать файл мы получили отказано в разрешении.Мы знаем, что это когда файл создавался, потому что мы можем проверить /tmp/mysql_updates/temp/ для файла:

[root@localhost scripts]# ls /tmp/mysql_updates/temp/
(no output)

Файл не был создан.

Так что это моя проблема.Любая помощь в исправлении этой проблемы с отказом в разрешении была бы отличной.

Что я пробовал:

sudo -u mysql / bin / bash - затем запустите скрипт.Нет ошибок, работает как положено.

Я не уверен, что еще попробовать.

...