MySQL分叉的进程无法创建新文件

时间:2019-06-27 13:19:12

标签: mysql python-3.x

我不确定此问题的名称是否明确,请随时对其进行编辑。

我正在尝试使用UDF在mysql内部运行python脚本。我使用的UDF的来源可以在here中找到。

此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-然后执行脚本。没有错误,按预期方式工作。

我不确定还能尝试什么。

0 个答案:

没有答案