crontab和screen不能一起用么?

sh/bash/dash/ksh/zsh等Shell脚本
回复
iceking2nd
帖子: 5
注册时间: 2013-10-25 13:06
系统: Debian 7.1.0

crontab和screen不能一起用么?

#1

帖子 iceking2nd » 2013-10-25 13:11

我写了一个脚本。想放到cron里面每分钟运行一次。但是发现脚本里面只有screen那行没执行,请各位大侠帮帮忙啊。

monitor.sh

代码: 全选

#!/bin/bash
HLDS_PATH="/usr/local/games/cs"
HLDS_PROGRAM="hlds_run"
MONITOR_FILE="monitor.log"
HLDS_RUN="$HLDS_PATH/$HLDS_PROGRAM -game cstrike -port 27015 +maxplayers 15 +sv_lan 0 -console -pingbooster 2 -noaff -noipx +map de_inferno -heapsize 131072 -zone 4096"

nc -z -w 5 -u 127.0.0.1 27015 > /dev/null 2>&1
if [ $? -ne 0 ]
then
        killall hlds_linux > /dev/null 2>&1
        killall hlds_run > /dev/null 2>&1
        killall screen > /dev/null 2>&1
        screen -wipe
        /usr/bin/screen -AmdS hlds $HLDS_RUN
        sleep 5
        HLDS_PID=`ps -A | awk '/hlds_linux/ { print $1 }'`
        renice -15 -p $HLDS_PID > /dev/null 2>&1
        echo "`date`:重启服务" >> $HLDS_PATH/$MONITOR_FILE
fi

exit 0

crontab中的写法

代码: 全选

* * * * * root /usr/local/games/cs/monitor27015 >> /test.log 2>&1
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: crontab和screen不能一起用么?

#2

帖子 lilydjwg » 2013-10-25 14:33

screen 需要控制终端,cron 里应该没有吧,而且你把 标准输出都重定向了。
iceking2nd
帖子: 5
注册时间: 2013-10-25 13:06
系统: Debian 7.1.0

Re: crontab和screen不能一起用么?

#3

帖子 iceking2nd » 2013-10-25 16:24

lilydjwg 写了:screen 需要控制终端,cron 里应该没有吧,而且你把 标准输出都重定向了。
可是我用screen的时候用了-AmdS参数啊。本来就是直接挂在后台上的。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: crontab和screen不能一起用么?

#4

帖子 lilydjwg » 2013-10-25 18:06

iceking2nd 写了:
lilydjwg 写了:screen 需要控制终端,cron 里应该没有吧,而且你把 标准输出都重定向了。
可是我用screen的时候用了-AmdS参数啊。本来就是直接挂在后台上的。
不太清楚,我早已不用 screen 了。

你可以在脚本里调用 screen 前 sleep 一段时间,然后趁这段时间用 strace -s 1024 -f -p <pid> -o log 连上去看看 screen 干了什么。其中 <pid> 是调用 sleep 的那个 shell 的。给你的命令会把数据记录到当前目录的 log 文件里。你若看不懂可以发出来。
iceking2nd
帖子: 5
注册时间: 2013-10-25 13:06
系统: Debian 7.1.0

Re: crontab和screen不能一起用么?

#5

帖子 iceking2nd » 2013-10-27 15:29

lilydjwg 写了:
iceking2nd 写了:
lilydjwg 写了:screen 需要控制终端,cron 里应该没有吧,而且你把 标准输出都重定向了。
可是我用screen的时候用了-AmdS参数啊。本来就是直接挂在后台上的。
不太清楚,我早已不用 screen 了。

你可以在脚本里调用 screen 前 sleep 一段时间,然后趁这段时间用 strace -s 1024 -f -p <pid> -o log 连上去看看 screen 干了什么。其中 <pid> 是调用 sleep 的那个 shell 的。给你的命令会把数据记录到当前目录的 log 文件里。你若看不懂可以发出来。
我直接在BASH下面执行这个脚本是可以成功的,只是放到CRON里面就不行了。我没找到SHELL的PID,只能去抓cron的strace了。但是结果我有点看不懂,而且很大。我上传个附件吧。
附件
log.txt
(706.26 KiB) 已下载 66 次
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: crontab和screen不能一起用么?

#6

帖子 eexpress » 2013-10-27 19:14

cron的环境,缺省没啥,别和shell比。连路径你都需要指出的。
cron的第一行,可以写上PATH=xxx;xxx
● 鸣学
iceking2nd
帖子: 5
注册时间: 2013-10-25 13:06
系统: Debian 7.1.0

Re: crontab和screen不能一起用么?

#7

帖子 iceking2nd » 2013-10-28 10:23

eexpress 写了:cron的环境,缺省没啥,别和shell比。连路径你都需要指出的。
cron的第一行,可以写上PATH=xxx;xxx
crontab里面已经有了这行

代码: 全选

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
应该不是环境变量的问题。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: crontab和screen不能一起用么?

#8

帖子 lilydjwg » 2013-10-28 13:14

代码: 全选

14363 stat64("cstrike", 0xbfaf8fe0)     = -1 ENOENT (No such file or directory)
14363 write(1, "Invalid game type 'cstrike' sepecified.\n", 40) = 40
你的 /usr/local/games/cs/hlds_run 程序的当前目录不对,它找不到需要的文件。它似乎是在 /root 下。你应该 cd 到正确的目录再执行它。
iceking2nd
帖子: 5
注册时间: 2013-10-25 13:06
系统: Debian 7.1.0

Re: crontab和screen不能一起用么?

#9

帖子 iceking2nd » 2013-10-29 10:21

lilydjwg 写了:

代码: 全选

14363 stat64("cstrike", 0xbfaf8fe0)     = -1 ENOENT (No such file or directory)
14363 write(1, "Invalid game type 'cstrike' sepecified.\n", 40) = 40
你的 /usr/local/games/cs/hlds_run 程序的当前目录不对,它找不到需要的文件。它似乎是在 /root 下。你应该 cd 到正确的目录再执行它。


就是这个问题。非常感谢! :em06
回复