4

我有一个通过 rc.local 启动的 python 守护进程。这个具有相同权限的相同脚本安装在我拥有的其他几个 Ubuntu 机器上。它在这些安装上运行没有问题。也就是说,重启盒子后,守护进程正在运行。

但是,通过这个特定的安装,当我登录并检查进程是否存在时,守护进程并未运行。系统之间的 rc.local 文件是相同的(或至少足够接近):

localaccount@sosms:~$ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

python /var/www/myDaemon/Main.py > /var/log/somelog.txt

exit 0

权限是:

localaccount@sosms:~$ ls -la /etc/rc.local
-rwxr-xr-x 1 localaccount localaccount 370 Jun  3 11:04 rc.local

我使用此测试 rc.local 测试了 rc.local 进程是否正在执行:

localaccount@sosms:/var/log/sosmsd$ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

echo "test" > /home/localaccount/test1
/usr/bin/python /var/www/sosms/sosmsd/Main.py > /var/log/sosmsd/log/log
echo "test" > /home/localaccount/test2

exit 0
localaccount@sosms:/var/log/sosmsd$

并且只有第一个测试文件(test1)在重启盒子后被创建。我猜这意味着 python 行引起了某种问题,但我在 /var/log/sosmsd/log/log 中没有输出:

localaccount@sosms:~$ ls
test1

更新:

然后我听从了 larsks 的建议,并确定我在启动 python 脚本时遇到了这个错误:

mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

这是否意味着 rc.local 在 MySQL 有机会被初始化之前被执行?我从这里去哪里?

4

5 回答 5

7

回答的其他人错过的一件事是在启动时运行的 rc、init 等脚本中,PATH 变量可能会或可能不会被初始化(永远无法保证),这意味着只需执行“python somescript.py”而不是/usr/bin/python 可能并不总是有效。始终对 init 脚本和 rc 脚本中的所有内容使用绝对路径。

是的,很可能 rc.local 在 mysqld 启动之前运行。您需要将其设置为 init.d 脚本,并在标题中使用 insserv 样式的注释来告诉它需要哪些依赖项。http://manpages.ubuntu.com/manpages/lucid/man8/insserv.8.html

于 2012-06-11T17:08:52.097 回答
3

Python exceptions -- and most other error messages -- go to stderr, but you're only redirecting stdout. You should be running your service like this:

python /var/www/myDaemon/Main.py > /var/log/somelog.txt 2>&1

The 2>&1 tells the shell to send stderr output to the same place as stdout. Do this and post any error messages you see if the problem doesn't end up being obvious.

于 2012-06-04T15:26:15.107 回答
3

/etc/init.d/mydaemon您应该从可用的骨架中为您的守护程序创建一个初始化脚本。

然后您将能够设置它的启动顺序,以便 MySQL 已经可用。

这是一个很好的起点

于 2012-06-06T19:51:04.610 回答
1

我的朋友。我花了几天时间来解决这个错误。幸运的是,我找到了解决方案。

sudo -u www -i /the/path/of/your/script

请首选sudo手册~ -i [命令] -i(模拟初始登录)选项将目标用户的密码数据库条目指定的shell作为登录shell运行...

你可以更喜欢我在这里发布的内容:Run script with rc.local: script works, but not at at boot

祝你好运!

于 2014-07-29T09:04:00.677 回答
0

来自 mysql 文档: C.5.2.2。无法连接到 [本地] MySQL 服务器

错误 (2002) Can't connect to ... 通常意味着系统上没有运行 MySQL 服务器,或者您在尝试连接到服务器时使用了不正确的 Unix 套接字文件名或 TCP/IP 端口号。您还应该检查您正在使用的 TCP/IP 端口是否未被防火墙或端口阻止服务阻止。

“/var/run/mysqld/mysqld.sock”文件是否存在?

mysql 服务器是否与 python 守护进程在同一台服务器上运行?

你看过mysql的日志吗?

它应该位于/var/log/

命名为:
mysql.log
mysql.err
mysqld.log
mysqld.err

$ sudo ls -l /var/log/
// when you have the name try
$ sudo tail -n 50 /var/log/LogName

一种可能性是您的磁盘空间不足,请尝试:

$ sudo df -h

查看第 4 列“Avail”

另一种可能性是文件夹权限,请尝试:

$ sudo ls -l /var/lib/

您应该看到如下内容:

drwxr-xr-x 33 mysql     mysql   4096 May 22 10:02 mysql

您很可能希望所有者和组是“mysql”,如果不是,您可以尝试:

$ sudo chown -R mysql:mysql /var/lib/mysql

首先记下原始设置,以便在没有帮助时将其更改回来。“-R”表示递归更改子文件夹和文件的所有权。

权限应该是 rwxr-xr-x (755),如果不是你可以试试:

$sudo chmod 755 /var/lib/mysql

我不会递归地这样做,大多数文件和文件夹应该只能由 mysql 用户访问,可能是 mysql 组,并且只能读/写不可执行。

于 2012-06-09T22:10:14.767 回答