sh/bash/dash/ksh/zsh等Shell脚本
-
iceking2nd
- 帖子: 5
- 注册时间: 2013-10-25 13:06
- 系统: Debian 7.1.0
#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
-
联系:
#2
帖子
由 lilydjwg » 2013-10-25 14:33
screen 需要控制终端,cron 里应该没有吧,而且你把 标准输出都重定向了。
-
iceking2nd
- 帖子: 5
- 注册时间: 2013-10-25 13:06
- 系统: Debian 7.1.0
#3
帖子
由 iceking2nd » 2013-10-25 16:24
lilydjwg 写了:screen 需要控制终端,cron 里应该没有吧,而且你把 标准输出都重定向了。
可是我用screen的时候用了-AmdS参数啊。本来就是直接挂在后台上的。
-
lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
-
联系:
#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
#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
- 来自: 长沙
#6
帖子
由 eexpress » 2013-10-27 19:14
cron的环境,缺省没啥,别和shell比。连路径你都需要指出的。
cron的第一行,可以写上PATH=xxx;xxx
● 鸣学
-
iceking2nd
- 帖子: 5
- 注册时间: 2013-10-25 13:06
- 系统: Debian 7.1.0
#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
-
联系:
#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
#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 到正确的目录再执行它。
就是这个问题。非常感谢!
