在另一个位置将bash脚本唤醒以继续工作之前,最短的睡眠方法是什么?
可能使用flock -u ..
还是在管道上阻止读取?
答案 0 :(得分:0)
说scriptA
睡觉,等待scriptB
唤醒。
一种方法是,在A
中,在您睡觉之前,将pid写入某个文件,例如scriptA.pid
,然后进入睡眠状态。
B
运行时,在适当的时候,您可以读取scriptA.pid
文件,获取A
的pid,然后执行pkill -P pidofA sleep
,从而进行睡眠子进程将被杀死,A
将继续执行。
答案 1 :(得分:0)
我是命名管道(fifo)的粉丝。 scriptA.sh:
pipe='/tmp/mypipe'
mkfifo "$pipe"
echo "$0 going to sleep..."
# Should block
read < "$pipe"
echo "$0 continuing"
scriptB.sh
pipe='/tmp/mypipe'
mkfifo "$pipe"
echo "$0 waking other process"
# might block
echo > "$pipe"
echo "$0 exiting"
如果第二个mkfifo: /tmp/mypipe: File exists
会打扰您,那么您将获得一个mkfifo
,然后首先测试其存在性(-e "$pipe"
)。这不会整理(rm
)fifo,不确定应该去哪里,因为应用程序的时间对于放置它至关重要。
答案 2 :(得分:0)
您可以使用进程间信号:kill
命令应用于使用其pid向进程发送信号。
SIGSTOP
信号停止该过程的执行。
SIGCONT
信号恢复进程执行。
以下示例脚本:
SIGSTOP
信号($$
是当前bash进程的pid)。希望其他进程将继续执行。
尝试一下:
#!/bin/bash --
printf "%s" $$ > /tmp/aScript.pid
kill -STOP $$ # STOP the execution here
# execution continues here when the SIGCONT signal is received
printf "script %s: received the SIGCONT signal\n" $$
在终端中测试:
$ ./aScript.sh &
[1] 26444
$ kill -CONT $(cat /tmp/aScript.pid)
script 26444: received the SIGCONT signal
答案 3 :(得分:0)
第一种方法
正在运行的脚本可以自行停止-
$: cat flagfile
#!/usr/bin/bash
echo $$ > /tmp/flagfile.pid
kill -STOP $$
date
$: ./flagfile &
[1] 24679
$: ps -fu $LOGNAME | grep 'flagfile$'
P2759474 24679 24521 0 13:29 pts/0 00:00:00 /usr/bin/bash ./flagfile
[1]+ Stopped ./flagfile
然后其他任何脚本都可以重新启动它。
$: kill -CONT $(</tmp/flagfile.pid)
$: Wed Dec 12 13:36:01 CST 2018
最后一行在后台进程设法输出日期之前给了我一个提示。 :)
第二种方法
如果可以的话,可以用陷阱将其打破。 这不是完全停止脚本,但您可以设置延迟并将其设置为有足够的余地等待它唤醒。
$: cat flagfile
#!/usr/bin/bash
trap 'loop=0' USR1
loop=1
delay=2
echo $$ > /tmp/flagfile.pid
while (( loop )); do sleep $delay; done
date
$: ./flagfile &
[1] 25018
$: ps -fu $LOGNAME | grep 'flagfile$'
P2759474 25018 24521 0 13:42 pts/0 00:00:00 /usr/bin/bash ./flagfile
只要您愿意,就等...
$: kill -USR1 $(</tmp/flagfile.pid)
$: Wed Dec 12 13:42:43 CST 2018
[1]+ Done ./flagfile