我的rc.local文件(Ubuntu)出了什么问题?

时间:2012-06-04 15:07:29

标签: linux ubuntu startup boot

我有一个通过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)")

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

Python异常 - 以及大多数其他错误消息 - 转到stderr,但您只是重定向stdout。你应该像这样运行你的服务:

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

2>&1告诉shell将stderr输出发送到与stdout相同的位置。如果问题最终不明显,请执行此操作并发布您看到的任何错误消息。

答案 2 :(得分:3)

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

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

这是good starting point

答案 3 :(得分:1)

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

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

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

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

祝你好运!

答案 4 :(得分:0)

来自mysql文档: C.5.2.2. Can't connect to [local] MySQL server

错误(2002)无法连接到...通常表示系统上没有运行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组,只有读/写不可执行。