树莓派开机自启的方法(解决rc.local开机步启动问题)

问题起源:
知道隔壁老王家的wifi 密码 提前在树梅派设置好了wifi帐号和密码,但是竟然进不了路由器管理页面。于是就不知道树梅派在局域网的ip这就非常尴尬了。然后呢!就弄个开机自动发送ip到我邮箱的脚本。于是就发生了下面的事情

发送邮件的脚本:

1.设置脚本

# -*- coding: utf-8 -*-

if __name__ == '__main__': 
    print "这是配置文件,不能单独运行"

#设置收件邮箱
toaddrs  = 'xxxxxxxxxx@163.com'

#设置发送邮箱
fromaddr = 'xxxxxxxxxxx@163.com' 

#设置发送邮箱的账号密码
username = 'xxxxxxxxx@163.com' 
password = 'xxxxxxxxxxxxxxx'

#设置SMTP服务器、端口,根据你的邮箱设置,
smtp_sever = 'smtp.163.com:25'

2.发送邮件获取ip脚本

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#version <= python 2.7
#__author__ = 'Page Wong'

import array
import struct
import socket
import fcntl
from datetime import datetime
import smtplib
from email.mime.text import MIMEText

def get_ip_address():
    '''
    #获取IP地址功能# 
    '''

    #先获取所有网络接口
    SIOCGIFCONF = 0x8912
    SIOCGIFADDR = 0x8915
    BYTES = 4096         
    sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    names = array.array('B',b'\0' * BYTES)
    bytelen = struct.unpack('iL', fcntl.ioctl(sck.fileno(), SIOCGIFCONF, struct.pack('iL', BYTES, names.buffer_info()[0])))[0]
    namestr = names.tostring()
    ifaces = [namestr[i:i+32].split('\0', 1)[0] for i in range(0, bytelen, 32)]

    #再获取每个接口的IP地址
    iplist = []
    for ifname in ifaces:
        ip = socket.inet_ntoa(fcntl.ioctl(sck.fileno(),SIOCGIFADDR,struct.pack('256s',ifname[:15]))[20:24])
        iplist.append(ifname+':'+ip)
    return iplist


def ip_save_file(iptxt):
    '''
    #存入IP地址到文件#
    直接发邮件不需读取次文件
    后续通过其它途径传送IP地址时用到 
    '''

    #获取当前时间,因为每次启动IP都在变,记录上时间容易区分
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

    #写入文件
    with open('ipaddress.txt','w') as f:
        f.write(now+'\r\n')
        for ip in get_ip_address(): 
            f.write(ip+'\r\n')


def ip_send_mail(iptxt):
    '''
    #发送IP地址到制定邮箱#
    '''
    #导入邮件账户配置文件
    import config as mail

    fromaddr = mail.fromaddr
    toaddrs = mail.toaddrs
    username = mail.username
    password = mail.password
    server = smtplib.SMTP(mail.smtp_sever)

    #设置邮件正文,get_ip_address()返回的是list,要转换成str
    ip = '\r\n'.join(iptxt)

    #设置邮件标题和正文
    msg = MIMEText(ip,'plain', 'utf-8')
    msg['Subject'] = 'IP For RaspberryPi'
    msg['From'] = fromaddr
    msg['To'] = toaddrs

    #启动SMTP发送邮件
    server.ehlo()
    server.starttls()
    server.login(username,password)
    server.sendmail(fromaddr, toaddrs, msg.as_string())
    server.quit()

def main():
    '''
    #程序入口#
    '''

    #获取IP
    iptxt = get_ip_address()

    #将IP存入文件,如果直接发送邮件,这步可以省略。
    ip_save_file(iptxt)

    #将IP地址发送到指定邮箱
    ip_send_mail(iptxt)

if __name__ == '__main__': 
    '''
    #运行
    '''   
    main()

这里什么都不用改了。

下面就是开机启动了。一开始用了很通用的办法在rc.local里面加入python /home/pi/get-ip-address.py

结果呢开机没有启动 至于为什么我现在也不清楚

于是我就用了另外一种办法

先给py脚本加上权限sudo chmod +x /home/pi/get-ip-address.py

然后保存一个开机启动脚本保存脚本为/etc/init.d/get-ip-address文件

#!/bin/sh
#/etc/init.d/get-ip-address

### BEGIN INIT INFO
# Provides:          get-ip-address
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: get-ip-address
# Description: This service is used to start my get-ip-address
### END INIT INFO

case "$1" in
    start)
        echo "Starting get-ip-address"
        nohup python /home/pi/get-ip-address.py &
         ;;
    stop)
        echo "Stop"
        #kill $( ps aux | grep -m 1 'python /home/pi/get-ip-address.py' | awk '{ print $2 }')
        ;;

    *)
        echo "Usage: service get-ip-address start|stop"
        exit 1
        ;;
esac
exit 0

保存之后添加权限sudo chmod +777 /etc/init.d/get-ip-address

加到开机启动sudo update-rc.d get-ip-address defaults

原创:http://www.jianshu.com/p/1a160067d8fd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值