暂停bash脚本,直到发出另一个信号

时间:2018-12-12 14:42:59

标签: bash

在另一个位置将bash脚本唤醒以继续工作之前,最短的睡眠方法是什么? 可能使用flock -u ..还是在管道上阻止读取?

4 个答案:

答案 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信号恢复进程执行。

以下示例脚本:

  • 将进程的pid存储在文件中。
  • 脚本向其自己的进程发送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