通过python脚本启动停止服务和关机

Start stop service and shutdown through python script

首先,我在这里完全是菜鸟,请原谅如果这是一个愚蠢的问题或违反了一些网络礼节 rule.This 是我在 unix/programming 世界的第一次尝试 我正在尝试制作一个基于覆盆子的网络摄像头机器人。 我想通过网页/python 脚本来控制它。 我正在尝试按照本教程进行操作 http://blog.ramon.no/2013/06/build-simple-internet-controlled-webcam.html

我使用 motion 而不是 mjpeg-streamer 设置 raspberry 以在网络上进行流式传输 page.Now 我正在尝试从网页停止启动流并关闭 raspberry。 这是我在论坛上阅读后得出的结果,但它不起作用。我设法连续三次关闭树莓派,但我改变了一些东西,现在我不能再这样做了

elif action == "shutdown":
print "Attempting to shut down"
call(["sudo", "shutdown", "-h", "now"])
elif action == "startstream":
    import os
os.system("sudo service motion start")
elif action == "stopstream":
    import os
os.system("sudo service motion stop" )

如果我按下启动/停止流没有任何反应如果我按下关闭我收到 500 错误

我授予了 www

的用户权限
sudo nano /etc/sudoers
www-data ALL=(ALL) NOPASSWD: ALL

执行脚本

chmod +x rambot.py

这是 apache 错误日志

[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5]   File ", referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] /usr/lib/cgi-bin/rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] ", line , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] 87, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5]     , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] elif action == "stopstream":, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5]     , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5]  , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5]  , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5]  , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] ^, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] SyntaxError: invalid syntax, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5]   File ", referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] /usr/lib/cgi-bin/rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] ", line , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] 87, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5]     , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] elif action == "stopstream":, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5]     , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5]  , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5]   ^, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] SyntaxError: invalid syntax, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] Premature end of script headers: rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:38 2015] [error] [client 192.168.0.5] Premature end of script headers: rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:39 2015] [error] [client 192.168.0.5] File does not exist: /var/www/css, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5]   File ", referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] /usr/lib/cgi-bin/rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] ", line , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] 87, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5]     , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5]   File ", referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] elif action == "stopstream":, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5]     , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5]    ^, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] SyntaxError: invalid syntax, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] /usr/lib/cgi-bin/rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] ", line , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] 87, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5]     , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] elif action == "stopstream":, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5]     , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5]  , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5]   ^, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] SyntaxError: invalid syntax, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] Premature end of script headers: rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:37:41 2015] [error] [client 192.168.0.5] Premature end of script headers: rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:18 2015] [error] [client 192.168.0.5] File does not exist: /var/www/css, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5]   File ", referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] /usr/lib/cgi-bin/rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] ", line , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] 87, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5]     elif action == "stopstream":, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5]        ^, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] SyntaxError: invalid syntax, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5]   File ", referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] /usr/lib/cgi-bin/rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] ", line , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] 87, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5]     , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] elif action == "stopstream":, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5]     , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5]  , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5]  , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5]  , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] ^, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] SyntaxError, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] : , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] invalid syntax, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] Premature end of script headers: rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:19 2015] [error] [client 192.168.0.5] Premature end of script headers: rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:59 2015] [error] [client 192.168.0.5]   File ", referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:59 2015] [error] [client 192.168.0.5] /usr/lib/cgi-bin/rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:59 2015] [error] [client 192.168.0.5] ", line , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:59 2015] [error] [client 192.168.0.5] 87, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:59 2015] [error] [client 192.168.0.5] , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:59 2015] [error] [client 192.168.0.5]     , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:59 2015] [error] [client 192.168.0.5] elif action == "stopstream":, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:59 2015] [error] [client 192.168.0.5]        ^, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:59 2015] [error] [client 192.168.0.5] SyntaxError: invalid syntax, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:38:59 2015] [error] [client 192.168.0.5] Premature end of script headers: rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:39:01 2015] [error] [client 192.168.0.5]   File ", referer: http://192.168.0.10:8083/
[Tue Feb 24 09:39:01 2015] [error] [client 192.168.0.5] /usr/lib/cgi-bin/rambot.py, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:39:01 2015] [error] [client 192.168.0.5] ", line , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:39:01 2015] [error] [client 192.168.0.5] 87, referer: http://192.168.0.10:8083/
[Tue Feb 24 09:39:01 2015] [error] [client 192.168.0.5] , referer: http://192.168.0.10:8083/
[Tue Feb 24 09:39:01 2015] [error] [client 192.168.0.5]     , referer: http://192.168.0.10:8083/

我看到缩进有偏差。如果这不是错字,请缩进如下:

elif action == "shutdown":
    print "Attempting to shut down"
    call(["sudo", "shutdown", "-h", "now"])
elif action == "startstream":
    import os
    os.system("sudo service motion start")
elif action == "stopstream":
    import os
    os.system("sudo service motion stop" )

如果这不是问题所在,抱歉我不确定。

您可以使用 OS 库中包含的进程管理函数来实现它:

http://docs.python.org/2/library/os.html#process-managment

建议使用 subprocess 模块执行命令,而不是 os.system() 函数。 参考:https://docs.python.org/2/library/os.html#os.system

The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function

此外,在脚本开头加载您需要的模块更为标准。

你可以这样做:

import subprocess
[...]
elif action == "shutdown":
    print "Attempting to shut down"
    return_code = subprocess.call(['sudo', 'shutdown', '-h', 'now'])
elif action == "startstream":
    return_code = subprocess.call(['sudo', 'service', 'motion', 'start'])
elif action == "stopstream":
    return_code = subprocess.call(['sudo', 'service', 'motion', 'stop'])

如果你想获得命令的输出,你可以使用 subprocess.check_output() 而不是 subprocess.call() :

cmd_output = subprocess.check_output(['sudo', 'service', 'apache2', 'status']) 
print(cmd_output)
cmd_output = cmd_output.decode('utf-8').strip('\n\r')
print(cmd_output)

这会打印:

b'Apache2 is running (pid 2024).\n'
Apache2 is running (pid 2024).

注意:我只用了python3,希望这里用python2没有区别。