Norbert Ignácz
Norbert Ignácz

Reputation: 33

Pause script by keyboard input

(Sorry for my bad english.) I would like to pause a running script by pressing the [SPACE] bar. The script must run, until the user not press the [SPACE] bar, then pause 20 seconds, and run forth. How can i continuously watch the keyboard input while the script is running?

Upvotes: 3

Views: 693

Answers (3)

Christoph85LE
Christoph85LE

Reputation: 85

I suggest to use a controlling script that freezes you busy script:

kill -SIGSTOP ${PID}

and then

kill -SIGCONT ${PID}

to allow the process to continue.

see https://superuser.com/questions/485884/can-a-process-be-frozen-temporarily-in-linux for more detailed explanation.

Upvotes: 0

Petr Skocik
Petr Skocik

Reputation: 60056

One way to do it:

#!/bin/bash -eu
script(){ #a mock for your script
    while :; do
        echo working
        sleep 1
    done
}

set -m #use job control
script & #run it in the background in a separate process group
read -sd ' ' #silently read until a space is read
kill -STOP -$! #stop the background process group
sleep 2 #wait 2 seconds (change it to 20 for your case)
kill -CONT -$! #resume the background process group
fg #put it in the forground so it's killable with Ctrl+C

Upvotes: 3

mcoolive
mcoolive

Reputation: 4205

I think the most simple way is to implement a script with checkpoints, which tests if a pause is required. Of course, it means your code never call 'long' running command...

A more complex solution is to use SIGPAUSE signal. You can have the main process that execute the script and the side process that catches [SPACE] and emit SIGPAUSE to the main process. Here I see at least two issues: - how to share the terminal/keyboard between the 2 process (simple if your main script don't expect input from keyboard), - if the main script starts several processes, you will have to deal with process group...

So it really depends on the complexity of your script. You may consider to rely only on regular Job control provided by Bash.

Upvotes: 0

Related Questions