如何在不终止脚本的情况下终止 bash 脚本中的 运行 进程?
How do you kill a running process in a bashscript without killing the script?
如何在不终止脚本的情况下终止 bash 脚本中的 运行 进程?
目标
所以...我需要终止 运行 进程才能继续执行我的脚本。
这是我的脚本的精简版:
# Setup
echo "Use ctrl+C to stop gathering data..."
./logger
#------------------
echo "Rest..."
我需要能够在不杀死脚本的情况下杀死 ./logger
预期与实际结果
我期待这样的结果:
Use ctrl+C to stop gathering data...
^C
Rest...
但是当我终止程序时它停止了
use ctrl+C to stop gathering data...
^C
./logger
命令是一个 C 程序,它已经处理了 SIGINT
信号 (Ctrl + C
),但它在接收到它之前不会停止。
有没有办法在不终止我的脚本的情况下停止程序?
C 程序并不重要,但看起来像这样
#include <stdio.h>
#include <signal.h>
int flag = 1;
void handler(int i)
{
flag = 0;
}
int main(int argc, char** argv)
{
signal(SIGINT, handler);
while(flag)
{
usleep(10000);
}
}
如果您在脚本 运行ning 所在的终端键入 control-C,信号将发送到所有进程 - 记录器程序和脚本。并且脚本终止,因为您没有告诉它在记录器 运行 时忽略信号。您也可以使用 trap
command but you'll need to undo the trapping before running the C program. See the Bash manual on Signals 来做到这一点。
例如,我有一个生成消息的程序dribbler
,默认情况下每秒生成一条消息,但它是可配置的。我将它用作您的 ./logger
程序的代理。 -m
选项指定消息; -n
选项要求对消息进行编号,-t
选项指定输出到标准输出(而不是默认写入的文件)。
#!/bin/bash
#
# SO 6418-0134
program="dribbler -t -n -m Hello"
echo "About to run '$program' command"
trap "" 2
(trap 2; $program)
echo "Continuing after '$program' exits"
sleep 1
echo "But not for long"
sub-shell 是必须的。当我 运行 该脚本 (trapper.sh
) 时,我得到,例如:
$ bash trapper.sh
About to run 'dribbler -t -n -m Hello' command
0: Hello
1: Hello
2: Hello
3: Hello
^CContinuing after 'dribbler -t -n -m Hello' exits
But not for long
$
顺便说一下,POSIX 为 syslog
守护进程定义了一个命令 logger
that writes messages using the syslog()
函数。
可能还值得查看关于 的问答,尤其是接受的答案及其在其他 Stack Exchange 站点上的问答链接,因为重要的是你和我都执行了 C 程序,而不是shell 脚本。
如何在不终止脚本的情况下终止 bash 脚本中的 运行 进程?
目标
所以...我需要终止 运行 进程才能继续执行我的脚本。
这是我的脚本的精简版:
# Setup
echo "Use ctrl+C to stop gathering data..."
./logger
#------------------
echo "Rest..."
我需要能够在不杀死脚本的情况下杀死 ./logger
预期与实际结果
我期待这样的结果:
Use ctrl+C to stop gathering data...
^C
Rest...
但是当我终止程序时它停止了
use ctrl+C to stop gathering data...
^C
./logger
命令是一个 C 程序,它已经处理了 SIGINT
信号 (Ctrl + C
),但它在接收到它之前不会停止。
有没有办法在不终止我的脚本的情况下停止程序?
C 程序并不重要,但看起来像这样
#include <stdio.h>
#include <signal.h>
int flag = 1;
void handler(int i)
{
flag = 0;
}
int main(int argc, char** argv)
{
signal(SIGINT, handler);
while(flag)
{
usleep(10000);
}
}
如果您在脚本 运行ning 所在的终端键入 control-C,信号将发送到所有进程 - 记录器程序和脚本。并且脚本终止,因为您没有告诉它在记录器 运行 时忽略信号。您也可以使用 trap
command but you'll need to undo the trapping before running the C program. See the Bash manual on Signals 来做到这一点。
例如,我有一个生成消息的程序dribbler
,默认情况下每秒生成一条消息,但它是可配置的。我将它用作您的 ./logger
程序的代理。 -m
选项指定消息; -n
选项要求对消息进行编号,-t
选项指定输出到标准输出(而不是默认写入的文件)。
#!/bin/bash
#
# SO 6418-0134
program="dribbler -t -n -m Hello"
echo "About to run '$program' command"
trap "" 2
(trap 2; $program)
echo "Continuing after '$program' exits"
sleep 1
echo "But not for long"
sub-shell 是必须的。当我 运行 该脚本 (trapper.sh
) 时,我得到,例如:
$ bash trapper.sh
About to run 'dribbler -t -n -m Hello' command
0: Hello
1: Hello
2: Hello
3: Hello
^CContinuing after 'dribbler -t -n -m Hello' exits
But not for long
$
顺便说一下,POSIX 为 syslog
守护进程定义了一个命令 logger
that writes messages using the syslog()
函数。
可能还值得查看关于