我的目的是在shell脚本中创建几个进程,并且让其后台运行,在使用jobs命令查看进程信息;
但结果有点不对;
[root@localhost shell]# cat creatpro
#!/bin/sh
echo " this is proc1! "
./process1 &
echo "this is proc2"
./process2 &
echo "this is proc3"
./process3 &
[root@localhost shell]# ./creatpro
this is proc1!
this is proc2
this is proc3
[root@localhost shell]# jobs
[root@localhost shell]# //显然这里应该是后台进程信息的,但没有
后来,在shell脚本外调用进程,在使用jobs:
[root@localhost shell]# ./process1 & //这里的process1和process2是我自定义的进程,也就是两个死循环
[1] 3272
[root@localhost shell]# ./process2 &
[2] 3273
[root@localhost shell]# jobs
[1]- Running ./process1 & //这里输出了后台进程信息,且只有外面调用的两个进程,shell里的依然没有
[2]+ Running ./process2 &
有没有知道这究竟是什么情况?
acrofox 于 2010-01-04 12:13:42发表:
有时候自己多动手做点简单的试验还是值得的。我把我的试验过程贴在这吧:[code]$ cat > /tmp/xx <#!/bin/bash
sleep 1000 &
sleep 1000 &
jobs
!
$ chmod a+x /tmp/xx
$ /tmp/xx
[1]- Running sleep 1000 &
[2]+ Running sleep 1000 &
$ jobs[/code]其中$ 表示命令行提示符。
gzkevin88 于 2010-01-04 10:53:50发表:
1# 安知鱼
你执行一个Shell脚本,那么系统会另外开1个shell
当你脚本执行完毕,这个Shell就会退出
这个Shell退出会导致你的那几个后台进程全部退出,因为你只是以&结尾而没有用nohup的方式
two__fishes 于 2010-01-04 10:12:31发表:
1:先要确定jobs这个命令是哪个shell的命令,因为你的脚本里面指定的是“/bin/sh”,也就是标准shell,而标准shell里面好像是没有jobs这个命令。
2:你可以先执行脚本“createpro”,再使用命令“ps -ef|grep process1”
1)如果能查出 process1进程,而“jobs”命令查不出,那就应该是shell的不同所造成的。
你想想,你用“/bin/sh”来调用 process1,又用其他shell的命令来查看,会有问题的。
2)如果“ps”命令查不出 process1进程,那就是你的脚本有问题 process1没调起来,但是shell的不同所造成的问题同样存在,只不过没发生。
3:你可以把脚本里面第一句“#!/bin/sh”改为“#!/bin/你的用户默认使用的shell”再试试看
4:Linux系统基本携带多个shell,包括“sh”、“ksh”、“csh”、“bash”等等,“sh”是标准的,肯定是有的,其他的版本的功能一般比他强大,呵呵,这个标准是不是有点磋啊?!
5:Linux系统所携带的shell都是处于守护状态,可以随时工作的,所以你有时候感觉不出来,至于你的用户配置使用的是哪个shell,就要自己看看了,在用户配置的界面上应该有显示,具体的linux怎么查看可能不太一样。顺便说一句,linux好像都不用标准的shell!
sfzfnm 于 2010-01-04 07:13:42发表:
路过
acrofox 于 2010-01-04 05:49:18发表:
它的子进程是在后台运行,但是 jobs 显示的是当前 shell 的任务。你可以在脚本文件内部加个 jobs 命令看看,一看就该明白了。
安知鱼 于 2010-01-03 22:10:04发表:
[i=s] 本帖最后由 安知鱼 于 2010-1-3 22:11 编辑 [/i]
3# acrofox
哦,是这样啊,也就是说,进入shell脚本也算是创建一个进程,可以这样理解吗?
那它的子进程不在后台运行吗?
acrofox 于 2010-01-03 20:27:57发表:
你在执行./createpro 时,shell 开一个子进程,然后 process1、process2、process3 又是这个子进程的子进程,所以你在原来的 shell 中看不到。
如果你用 source createpro 执行就可以看到了。
alick 于 2010-01-03 18:15:30发表:
请问LZ执行你的shell脚本了吗?