我有一个通过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?我从哪里开始?
答案 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)
答案 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组,只有读/写不可执行。