shell脚本中调用脚本

我在AIX的机器上写了这么一个脚本1.sh和2.sh【1.sh】#!/bin/shi=1while(($i<2))doechoI'm1.sh,I'mrunning....... 我在AIX的机器上写了这么一个脚本1.sh和2.sh
【1.sh】
#!/bin/sh
i=1
while(($i<2))
do
echo I'm 1.sh ,I'm running........
sleep 5
done
================我是脚本的分割线===================================
【2.sh】
#!/bin/sh
./1_sh
i=0
while(($i<1))
do
hour=`date +"%H"`
minutes=`date +"%M"`
seconds=`date +"%S"`

echo $hour
echo $minutes
echo $seconds
time=$hour$minutes$seconds

domain="1.sh"
#set the hour as you wish.0-24
plan_hour=17
#set the minutes as you wish.0-60
plan_minutes=20
#set the seconds as you wish.0-60
plan_seconds=00

plan_time=$plan_hour$plan_minutes$plan_seconds

if [ $time -eq $plan_time ]
then
echo prepar to shut down 1.sh
ps -ef | grep $domain |grep -v grep|awk '{print $2}'|xargs kill
echo already shut down 1.sh

sleep 60

./1_sh
fi

sleep 1
done
===============我是脚本的结束线- -!=============================

我的目的是通过执行2.sh来运行1.sh,当到达设定的时间点时候,杀掉1.sh,1分钟之后重新启动1.sh
起到一个定时重启的作用。

一开始想到直接用定时任务,crontab来做,但是这样就1.sh的打印信息就不会有窗口打印出来,而直接运行在后台。所以改用这种方法。

好了,下面该说遇到的【问题】了:我运行2.sh后发现,1.sh一直在运行,而2.sh中运行.sh后的代码根本不起作用,不用说定时重启,连打印到屏幕上的东西都没有。
我应该如何修改才能满足我的需求呢?请各位高手解惑。
l4nneret 兄 ,你的脚本我试过了,到了预设时间后确实进入到IF语句中了,但是我先运行1.sh后,运行2.sh,到了预设时间的时候并没有把我之前启动的1.sh的进程杀死,然后过了一分钟后有开了一个1.sh的进程。

首先这个2.sh的脚本功能需求是这样的,运行它后会先无条件执行1.sh,1.sh中该打印到屏幕的要打印到【该窗口】,然后【每天】到达预设时间后在同一窗口1.sh断开,1分钟后重新运行1.sh。进程中时钟会有1.sh在运行,只有在预设时间时候才会被杀死1分钟。
展开
 我来答
l4nneret
推荐于2016-05-26 · TA获得超过678个赞
知道小有建树答主
回答量:389
采纳率:0%
帮助的人:357万
展开全部
里面有个错误,time 是个命令,不能用来做变量,这是致命的!
----------------
我给个测试脚本你试一下:
.............
#!/bin/sh
flag=0
plan_hour=19
plan_minutes=47
plan_time=`echo -n "$plan_hour";echo -n "$plan_minutes"`
clear

while true
do
hour=`date +"%H"`
minutes=`date +"%M"`
seconds=`date +"%S"`
time1=`echo -n "$hour";echo -n "$minutes"`
clear
echo -n "现在的时间为: "
echo -n $hour
echo -n :
echo -n $minutes
echo -n :
echo -n $seconds

if [ "$time1" -eq "$plan_time" ]; then
flag=1
clear
echo -n "3秒后关闭 1.sh"
sleep 3
ps -ef|grep "sh 1.sh"|grep -v grep|awk '{print $2}'|xargs kill
clear
echo "1.sh 已经结束;2.sh 1分钟后唤醒 1.sh"
sleep 59
fi

sleep 1
if [ $flag -eq 1 ]; then
sh 1.sh
exit 0
fi

done
===============
脚本一开始预定关闭 1.sh 的时间。
在未到定时时,就显式时间。
定时时间到,给出杀死 1.sh 的提示,3秒后杀死,然后再 1 分钟后再唤醒 1.sh 进程。唤醒 1.sh 后,2.sh 也就跟着退出了。
------------------------------------------------------
2.sh 时间设对了是可以杀死 1.sh 的。
如果按照你的要求,我觉得写个程序应该更好处理些,参考代码如下:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

int main()
{
pid_t pid;
while(1) {
pid = fork();

switch(pid) {
case -1:
perror("fork failed");
exit(1);
case 0:
while(1) {
printf("I'm 1.sh ,I'm running........\n");
sleep(1);
}

default:
sleep(5);
kill(pid, SIGKILL);
printf("child over\n");
sleep(40);
break;
}
}
return 0;
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
上面程序,先 fork() 出一个子进程,相当于 1.sh,然后你在子进程里做你要做的事情。父进程在 5s 后(相当于每天预设的一个时间,每天的时间设定可用相关的函数进行设置检测)杀死子进程,然后睡眠 40s,醒来后,又循环 fork() 同样的子进程做同样的事情。
七家生0D
2009-07-08 · TA获得超过1944个赞
知道小有建树答主
回答量:1675
采纳率:0%
帮助的人:1263万
展开全部
问题在于./1.sh永远在执行, i=0永远不会被执行。
解决执行的方法可以在./1.sh后面加上& 这样就在后台执行了。
./1.sh &

但是在后台执行需要注意, 就是2.sh结束了 1.sh也不会结束。需要在脚本里面设置kill杀掉他
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式