【发布时间】:2016-12-14 19:22:43
【问题描述】:
我正在尝试实现一个定时功能。如果计时器超时,则应终止该功能/命令。如果函数/命令完成,计时器不应让 bash 等待计时器超时。
(cmdpid=$BASHPID; \
( sleep 60; kill $cmdpid 2>/dev/null) & \
child_pid=$!; \
ssh remote_host /users/jj/test.sh; \
kill -9 $child_pid)
test.sh 可能会也可能不会在 60 秒内完成。这很好用。
但是当我想得到 test.sh 的结果时,它会回显“SUCESS”或“FAILURE”,我尝试了
result=$(cmdpid=$BASHPID; \
( sleep 60; kill $cmdpid 2>/dev/null) & \
child_pid=$!; \
ssh remote_host /users/jj/test.sh; \
kill -9 $child_pid)
在这里等待计时器退出。我可以看到使用 set -x 命令执行了“kill -9 $child_pid”,但是 kill 并不是真正杀死子 shell。
【问题讨论】:
-
你说的是什么子shell?如果
sleep完成,kill $cmdpid将杀死第一个子shell...如果仅使用 QUIT 信号(我不确定)是否可行。我的疑问:如果子shell 的任何子进程被挂起,是否可以使用 QUIT 信号杀死子shell? -
问题是您正在杀死子shell,而不是其中的
sleep。如果您查看ps,您会看到sleep的父 pid 为 0。 -
您知道
timeout命令吗?我似乎在尝试重新发明轮子...... -
使用
timeout很方便,但它不会杀死由脚本启动的独立子进程(例如)nohup /folder/OtherScript &。通过将计时器放在一个单独的脚本中,可以自定义计时器并杀死这些独立的子进程。 -
@cdarke:你是对的。内部子壳被杀死,但睡眠仍然存在。但是sleep的PID不是0,而是$child_pid+1。谷歌一点点告诉我,当一个进程被杀死时,只有它的直接子进程被发出信号。但是由于我正在杀死 sleep 的父级,所以新的父级是 1。
标签: bash