use*_*345 13 command-line bash kill
当我kill在命令行上使用时,它可以工作。
kill -SIGSTOP 1234
Run Code Online (Sandbox Code Playgroud)
但是如果我在 bash 脚本文件中使用,我会收到这个错误:
kill: SIGSTOP: invalid signal specification
Run Code Online (Sandbox Code Playgroud)
.sh 文件是
#!/bin/sh
kill -SIGSTOP 1234
Run Code Online (Sandbox Code Playgroud)
如何kill在 bash 脚本中使用?我试过这个:
#!/bin/sh
/bin/bash -c "kill -SIGSTOP 1234"
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
Sté*_*las 14
的标准(POSIX)的语法是:
kill -s STOP "$pid"
Run Code Online (Sandbox Code Playgroud)
也就是说,没有SIG前缀。一些 shell 实现,支持kill -s SIGSTOP或kill -SIGSTOP作为扩展,但这不是标准的,也不是可移植的。
UNIX 规范 (POSIX+XSI) 还允许:
kill -STOP "$pid"
Run Code Online (Sandbox Code Playgroud)
和
kill -19 "$pid"
Run Code Online (Sandbox Code Playgroud)
尽管SIGSTOP未指定哪个信号编号,并且可能会在系统之间甚至同一系统的体系结构之间发生变化,因此应该避免。
首先: SIGSTOP将暂时停止进程但保留在内存中,以便稍后可以使用SIGCONT系统调用继续。您可以使用以下小片段来查看会发生什么
#!/bin/bash
set -x
sleep 100 &
pid=$!
kill -s SIGSTOP "$pid"
sleep 2
kill -s SIGCONT "$pid"
Run Code Online (Sandbox Code Playgroud)
您将看到脚本以交互方式执行的操作。
因此,为了让你的脚本使用#/bin/shshebang 工作,你需要做类似的事情
#!/bin/sh
set -x
set +o posix
sleep 100 &
pid=$!
kill -s SIGSTOP "$pid"
sleep 2
kill -s SIGCONT "$pid"
set -o posix
Run Code Online (Sandbox Code Playgroud)