我不确定这个问题是否与此处或 Meta 相关,但请在downvote之前完成帖子!
我认为这个问题看起来有点模糊,但我会广泛地讨论这个问题。
我正在使用相当数量的 Raspberry Pis 。规格如下:
Raspbian Wheezy 7.10 / 7.11
Model-B Raspberry Pi - 2
作为在可拆卸模式下运行脚本的方法,我在Pis上使用tmux
。
我创建了一个bash脚本来启动一个tmux会话,该会话在使用crontab
和@reboot
标记启动Pi时被触发。简而言之:
# have a bash script to trigger the session on boot
# in a bin/ folder in $HOME directory
/home/pi/bin/session.sh
# above mentioned path gets triggered on crontab reboot
## In the crontab
@reboot /home/pi/bin/session.sh
session.sh
的外观如何?
#!/bin/bash
tmux new-session -d -s session1
tmux set-option -t session1 set-remain-on-exit-on
tmux new-window -d -n 'pyScript' -t session1:1 'sudo /home/pi/bin/pyScript.py'
exit 0
如前所述,pyScript.py
有socket
申请。因此,我们打开一个套接字,根据应用程序在Pi上发送和接收数据。
tmux
附加tmux a
会话时已对此进行了检查。 Python脚本上的错误会导致tmux window
冻结,显示窗格已死亡。 pyScript.py
失败的原因是套接字没有bind
。 最初我认为这是我的编程错误,但如果我自己像sudo /home/pi/bin/myScript.py
一样运行脚本,那么脚本完美地运行! 没有发现任何错误或异常。
这是完全相同的脚本。
我总是抓到什么错误?
setsockopt(socket.IPPROTO_IPV6,socket.IPV6_JOIN_GROUP,mreq)
找不到设备
这非常有趣,因为在触发crontab脚本并创建tmux会话之前,所有网络接口都已设置并运行。
之前我曾与tmux
进行过一场比赛,而我曾经被触发的一些脚本也曾经用过。因此,我介绍的 Hack 是一个sleep
命令。所以现在我的session.sh
脚本看起来像:
## see the magic sleep here! Script works great now!
tmux new-window -d -n 'pyScript' -t session1:1 'sleep 20; sudo /home/pi/bin/pyScript.py'
现在脚本完美触发了!一切都是我想要的方式!
由于tmux
基于 C ,并且它是基于编译器的语言,因为我的脚本是 Python ,并且它是基于解释器的语言:
这是C固有的比Python快,而且Py解释器需要一些时间来设置一切!因此
sleep
的理由是什么?
我不是计算机科学家/工程师,但我想对添加sleep
命令的Hack进行合理的解释。
我认识到C / C ++与基于解释器的语言(如Python)相比,实际上是 fast 。这是一个清晰的应用程序,它显示了这两种语言是如何变化的?
只是一个好奇的头脑试图找出并证明我的工作!
感谢
我发现This Thread: Crontab SQL boot crontab哪个解决问题正好与我的Hack想法有关。
答案 0 :(得分:2)
Crontab在系统完成重启之前运行@reboot
脚本。如果您的脚本需要在重新启动完成之前不可用的服务,则您的脚本需要(a)在使用之前测试这些服务的存在,或者(b)不要使用@reboot
。
如果您需要提供所有服务,请考虑使用/etc/rc.local
。在大多数系统上(FreeBSD除外),它运行after reboot is complete。
来自man 5 crontab
:
请注意,就@reboot而言,启动就是 cron(8)守护进程启动时的时间。 特别是,它可能在之前 一些系统守护进程或其他设施是启动。这是应该的 到机器的启动顺序序列。 [重点补充。]
有关编辑Raspberry Pi的rc.local
的信息为here。
rc.local
和启动订单在类似Debian的系统上,文件/etc/init.d/rc.local
通常包含标题:
#! /bin/sh
### BEGIN INIT INFO
# Provides: rc.local
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
### END INIT INFO
行# Required-Start: $all
表示只有在所有其他服务启动后才能运行此脚本。
可以通过选中$all
来验证系统如何解释该行中的/etc/init.d/.depend.start
字符串。它应该包含rc.local
的行,如:
rc.local: rsyslog dbus atd cups-browsed avahi-daemon smartmontools cups bootlogs motd acpid ntp rsync ssh cron
此行明确列出了rc.local
启动前应运行的所有服务。
文件/etc/init.d/.depend.start
由系统管理。