永发信息网

Linux SHELL 获取进程ID

答案:3  悬赏:40  手机版
解决时间 2021-02-11 13:38
  • 提问者网友:斑駁影
  • 2021-02-10 23:37
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,郁闷
最佳答案
  • 五星知识达人网友:胯下狙击手
  • 2021-02-11 00:28
slp后无论加不加& ,pid中获取到的实际进程ID和main进程ID始终是一样的,因为slp函数是在当前脚本进程中运行。除非你调用外部脚本。

你可以在 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
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯