这个睡眠命令在我的tmux脚本中是否是合理的黑客攻击?如果是这样的话?

时间:2016-07-09 22:18:48

标签: python linux bash tmux

注意

我不确定这个问题是否与此处或 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.pysocket申请。因此,我们打开一个套接字,根据应用程序在Pi上发送和接收数据。

初步观察

  • 重新启动Pi后,python脚本失败。我们在使用tmux附加tmux a会话时已对此进行了检查。 Python脚本上的错误会导致tmux window冻结,显示窗格已死亡pyScript.py失败的原因是套接字没有bind

最初我认为这是我的编程错误,但如果我自己像sudo /home/pi/bin/myScript.py一样运行脚本,那么脚本完美地运行没有发现任何错误或异常

  

这是完全相同的脚本。

  • 我尝试了脚本中的所有更改,以克服python脚本中的任何绑定错误,但每次重新启动脚本时都会触发相同绑定的错误错误

我总是抓到什么错误?

  

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想法有关。

1 个答案:

答案 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由系统管理。