我想在 ubuntu 启动时自动运行 python 脚本。通常我需要做的是在 ubuntu 上打开命令行并输入
python /home/ubuntu/Desktop/UDP_Server.py
这将运行 python 代码,所以我现在可以启动我的其他客户端代码来与其通信。
我想找到一种方法在启动时自动运行此代码。我尝试将脚本放入我的/etc/init.d
文件中,也尝试将其作为启动程序,如下所示。
但是当我打开电脑时,这段代码却无法运行,因为它没有像我期望的那样与我的客户端代码进行通信(就像我从命令行运行 python 脚本时一样)
编辑:
在 rc.local 中放入 touch 命令之类的命令似乎在启动时有效。对于 crontab 也是如此。我添加了一个命令 @reboot,它可以工作。但这个特定的代码似乎在启动时不起作用(无论我将其放入 crontab、rc.local、init.d 还是作为启动应用程序)
以下是我的 UDP 服务器代码
import socket
import serial
import subprocess
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = (192.168.1.13, 10000)
print 'starting up on %s port %s' % server_address
sock.bind(server_address)
ser = serial.Serial('/dev/ttymxc3', 115200, timeout = 0)
print 'Serial connected'
while True:
data = sock.recv(7)
print 'received ', data
if data == "STOP":
subprocess.call(["sudo", "shutdown", "-h", "now"])
else:
ser.write(data)
当我在命令行运行它时,它的工作原理如下
starting up on 192.168.1.13 port 10000
Serial connected
然后程序等待连接。如果我的 UDP 客户端发送 STOP
received 'STOP'
然后计算机就关闭了。
但是当代码在启动时运行并且我通过 UDP 客户端发送“STOP”时,计算机不会关闭。服务器代码中带有 sock.recv 的 while 循环不知何故没有接收到发送给它的字符串。
解决方案:
在我将以下代码行添加到我的 /etc/network/interfaces 文件后
auto wlan0
iface wlan0 inet dhcp
post-up python /home/ubuntu/Desktop/UDP_Server.py
启动时执行的代码在 Wi-Fi 网络恢复工作后所以我的客户端能够与服务器通信。
答案1
我经常发现在启动时运行某些东西的最简单方法是通过带有@reboot 的 cron。
它可存在于您的用户 crontab 中,这通常比通过以 root 权限启动的 init 运行它更好。
看手册页有关详细信息,请参阅 crontab(5)。
它并不适合每种用途,但它通常是一种很好的机制,并且非常容易实现。
答案2
我认为您需要在rc.local
以 root 身份运行的所有脚本中添加您的脚本。
编辑rc.local
:
sudo nano /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 /home/ubuntu/Desktop/UDP_Server.py
exit 0
Ctrl要使用 nano 按+保存并退出X。
答案3
您需要在网络接口启动后运行命令。如以下答案所述:https://unix.stackexchange.com/a/91264