我想在启动时在屏幕上运行一个脚本。
这不起作用:
@reboot pi screen -d -m /home/pi/db_update.py
但是,以用户 pi 身份手动运行此命令是可行的:
screen -d -m /home/pi/db_update.py
你知道我缺少什么吗?
答案1
您应该以用户身份运行并添加@reboot pi ...
以下内容,而不是添加:/etc/crontab
crontab -e
pi
@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/syslog
应CMD
在该行之后返回一行:(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"
检查日志文件
- 之后运行一个 shell,以便它继续运行,您可以检查输出,如解释所示https://unix.stackexchange.com/a/47279/103306-
就我而言,这是一个尝试连接到本地 PostgreSQL 数据库的脚本,该数据库未完成启动,并且发出FATAL
错误消息。cron
也就是说,一切都很好screen
,但该组合在机器启动序列中运行得太快了。
另外,我应该提到,您不必从全局 crontab 文件 ( ) 切换到用户文件,在使用您的命令/etc/crontab
创建例如时有一个中间立场。/etc/cron/local-pi-whathaveyou
这样,对于任何检查的人来说都是显而易见的/etc
,但您保留了非特权用户。