tst.sh 文件内容如下
-----------------------------------------
#!/bin/sh
slp(){
echo $$>/tmp/pid
sleep 30
}
echo "main: $$"
slp &
echo "last back: $!"
-----------------------------------------
运行:./tst.sh && sleep 1 && cat /tmp/pid
返回值
main: 12755
back: 12756
12755
奇怪了,pid文件中不应该是12756么?如果我把slp后的“&”拿掉就OK了,pid中就能获取到实际进程ID了。应该怎么处理,即获取后台的ID,在slp中
########################################################################
代码改下:
[root~]# cat tst.sh
#!/bin/sh
slp(){
echo "func \$\$: $$">/tmp/pid
echo "func \$!:$!">>/tmp/pid
sleep 30
}
echo "main \$\$: $$"
slp &
echo "main \$!: $!"
sleep 1
cat /tmp/pid
ps
[root~]# ./tst.sh && sleep 1 && ps
main $$: 19131
main $!: 19132
func $$: 19131
func $!:
PID TTY TIME CMD
18985 pts/2 00:00:00 bash
19131 pts/2 00:00:00 tst.sh
19132 pts/2 00:00:00 tst.sh
19133 pts/2 00:00:00 sleep
19136 pts/2 00:00:00 ps
PID TTY TIME CMD
18985 pts/2 00:00:00 bash
19132 pts/2 00:00:00 tst.sh
19133 pts/2 00:00:00 sleep
19138 pts/2 00:00:00 ps
[root~]#
感觉加了&后像是C中的fork()一样,只是$$不知道什么原因,得不到真正的pid,郁闷
Linux SHELL 获取进程ID
答案:3 悬赏:40 手机版
解决时间 2021-02-11 13:38
- 提问者网友:斑駁影
- 2021-02-10 23:37
最佳答案
- 五星知识达人网友:胯下狙击手
- 2021-02-11 00:28
slp后无论加不加& ,pid中获取到的实际进程ID和main进程ID始终是一样的,因为slp函数是在当前脚本进程中运行。除非你调用外部脚本。
你可以在 slp & 这句后加一句 ps >/tmp/log
然后看看slp后加&和不加&的情况下/tmp/log中显示的进程列表有何不同,就应该明白了。区别仅在于 $! 有值和没有值。
你可以在 slp & 这句后加一句 ps >/tmp/log
然后看看slp后加&和不加&的情况下/tmp/log中显示的进程列表有何不同,就应该明白了。区别仅在于 $! 有值和没有值。
全部回答
- 1楼网友:一秋
- 2021-02-11 03:15
shell确实是一个进程 一般默认都是/bin/bash 通过ps aux可以看到
shell中再运行shell,就是创建一个子shell,也就是子进程
通过pstree可以查看进程树
- 2楼网友:長槍戰八方
- 2021-02-11 01:45
slp&
slp_pid=$!
slp_pid就是你要的结果了。
第二种方案:
在function内部使用$BASHPID
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯