通过 @reboot cron 作业运行“screen”

通过 @reboot cron 作业运行“screen”

我想在启动时在屏幕上运行一个脚本。

这不起作用:

@reboot pi screen -d -m /home/pi/db_update.py

但是,以用户 pi 身份手动运行此命令是可行的:

screen -d -m /home/pi/db_update.py

你知道我缺少什么吗?

答案1

您应该以用户身份运行并添加@reboot pi ...以下内容,而不是添加:/etc/crontabcrontab -epi

@reboot /usr/bin/screen -d -m /home/pi/db_update.py

确保使用屏幕的完整路径(只是为了确保它可以在没有它的情况下工作),并且 /home/pi 不在加密文件系统上(在那里,完成了)。该命令不能依赖于仅在cron守护程序启动或用户登录后才能访问的任何内容。

您可能想要添加一些内容db_update.py(写入文件/var/tmp以查看它是否实际运行),或者在 python 程序末尾放置 time.sleep(600) 以留出足够的时间登录和连接。


在 Lubuntu 13.04、python 2.7.4 上进行测试,条目如下:

@reboot screen -d -m /home/anthon/countdown.py

countdown.py

#!/usr/bin/env python
import time
for x in range(600,0,-1):
    print x
    time.sleep(1)

(和chmod 755 countdown.py

答案2

我有一个类似但略有不同的使用场景,需要在启动时将屏幕附加到某些东西上。我有两台无头服务器,其中一台只有串行输出。我通过串行电缆将其连接到另一个无头服务器,并且我需要使用屏幕通过串行连接进行交互。我还需要确保在不查看串行会话时捕获了生成的任何输出。

我在 root 的 crontab 中有这个

@reboot    /usr/bin/screen -d -m -c .screenrc -L /dev/ttyS0

如果应用了安全更新,服务器将在一天中的设定时间重新启动。我想要专门命名的日志文件,以便在需要时可以查看它们。我的.screenrc文件中有此条目

logfile "/root/.screen_%H_%Y%m%d_%c.txt"

因此,当下一个屏幕会话开始时,日志文件位于/home/root/.screen_$HOSTNAME_$YYYYMMDD_$h:$mm.txt.

答案3

虽然这可能是一种解决方法,但我通过运行调用屏幕会话的 shell 脚本解决了这个问题。

[dude@server ~]$ crontab -l | grep sh
@reboot /home/dude/.autoscreen/start.sh
[dude@server ~]$ cat /home/dude/.autoscreen/start.sh
#!/bin/bash
cd ~
screen -S myname -d -m custom_script

答案4

有几种简单的方法可以了解启动时启动的屏幕发生了什么:

  • 它甚至开始了吗?重新启动后,grep CRON /var/log/syslogCMD在该行之后返回一行:(CRON) INFO (Running @reboot jobs)

  • 如果它启动了,但当您查看时屏幕已经消失,则退出中的命令 - 有多种方法可以对此进行调试,例如:

    • 之后运行一个 shell,以便它继续运行,您可以检查输出,如解释所示https://unix.stackexchange.com/a/47279/103306-screen ... -- sh -c "your command; exec sh"
    • 例如,在 script(1) 中运行命令,然后screen ... -- script -f yourcommand.boot.log -c "your command"检查日志文件

就我而言,这是一个尝试连接到本地 PostgreSQL 数据库的脚本,该数据库未完成启动,并且发出FATAL错误消息。cron也就是说,一切都很好screen,但该组合在机器启动序列中运行得太快了。

另外,我应该提到,您不必从全局 crontab 文件 ( ) 切换到用户文件,在使用您的命令/etc/crontab创建例如时有一个中间立场。/etc/cron/local-pi-whathaveyou这样,对于任何检查的人来说都是显而易见的/etc,但您保留了非特权用户。

相关内容