如何从OSX中的终端暂停(不停止)正在运行的脚本,以便稍后从暂停时恢复?
答案 0 :(得分:40)
如果您使用BASH作为shell(Mac上的默认shell),您可以使用BASH内置的作业控制功能。
如果脚本在终端的前台运行,您可以按 Control - Z 来暂停脚本。这将暂停运行脚本。
要重新启动它,请输入jobs
,然后您就会看到其中列出已暂停的作业。键入fg
或更具体的fg %x
,其中x
是已暂停作业的号码。
$ test.pl # Test script (prints out Foo every two seconds
Foo!
Foo!
^Z
$ # Job has been suspended
$ jobs
[1] + Stopped ./test.pl
$ fg %1 #Restarts Job #1
Foo!
挂起作业的 Control-Z 键是默认值,但可以修改。 stty可以更改此设置,并显示当前默认值:
$ stty -a
speed 9600 baud; 40 rows; 120 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^H; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
您可以看到最后一行有susp = ^Z
。这是暂停您的脚本的关键。在这种情况下,它是 Control-Z 。
您还可以使用bg
命令在后台运行暂停的作业。但是,当您关闭shell /终端窗口时,后台作业将终止,除非您已将nohup添加到命令的前面。
答案 1 :(得分:8)
查找正在运行的脚本的进程ID。
要停止(或者您称之为暂停)脚本,请说:
kill -SIGSTOP PID
要恢复已停止(或已暂停)的过程,请说:
kill -SIGCONT PID
(其中PID
指的是数字进程ID。)
答案 2 :(得分:3)
补充@devnull和@ DavidW的有用答案:
以下是方便函数,用于从任何 shell(不仅仅是启动脚本的shell)暂停(暂停)/按名称恢复脚本:
传递脚本的文件名(不带路径):
suspend-script someScript ...
以后:
resume-script someScript ...
更新:为名称添加查杀脚本的附加功能:kill-script someScript ...
bash
或sh
运行的脚本(实际上只是OSX上的bash
别名)。suspend-script
和resume-script
:如果脚本进程已处于所需状态,则不执行任何操作(并且不会报告错误)。功能(例如,将它们放在~/.bash_profile
中):
suspend-script() {
[[ -z $1 || $1 == '-h' || $1 == '--help' ]] && { echo "Usage: $FUNCNAME scriptFileName ..."$'\n'"Suspends the specified bash/sh script(s)."; return $(( ${#1} == 0 )); }
local ec=0
for p in "$@"; do
pkill -STOP -nf '/?(bash|sh)[ ]+(.*/)?'"$p"'( |$)' \
&& echo "'$1' suspended." \
|| { ec=$?; echo "ERROR: bash/sh script process not found: '$p'" 1>&2; }
done
return $ec
}
resume-script() {
[[ -z $1 || $1 == '-h' || $1 == '--help' ]] && { echo "Usage: $FUNCNAME scriptFileName ..."$'\n'"Resumes the specified bash/sh script(s)."; return $(( ${#1} == 0 )); }
local ec=0
for p in "$@"; do
pkill -CONT -nf '/?(bash|sh)[ ]+(.*/)?'"$p"'( |$)' \
&& echo "'$1' resumed." \
|| { ec=$?; echo "ERROR: bash/sh script process not found: '$p'" 1>&2; }
done
return $ec
}
kill-script() {
[[ -z $1 || $1 == '-h' || $1 == '--help' ]] && { echo "Usage: $FUNCNAME scriptFileName ..."$'\n'"Kills the specified bash/sh script(s)."; return $(( ${#1} == 0 )); }
local ec=0
for p in "$@"; do
pkill -nf '/?(bash|sh)[ ]+(.*/)?'"$p"'( |$)' \
&& echo "'$1' killed." \
|| { ec=$?; echo "ERROR: bash/sh script process not found: '$p'" 1>&2; }
done
return $ec
}
答案 3 :(得分:1)
echo Press any key to continue...
read blah
然后对变量不执行任何操作。
这与我遇到的DOS批处理脚本中使用的pause
功能非常接近。