用于向进程发送信号的 Bash 文件

用于向进程发送信号的 Bash 文件

我需要编写一个 bash 程序,该程序将程序名称和信号名称作为参数,然后执行一些操作。如果没有给出信号名称,则默认信号应为 SIGINT。

程序 file.sh 需要检查给定的程序(来自参数)是否只有一个进程。如果是,它会向该进程发送给定的信号。如果有更多进程,file.sh 只需打印它们的 PID 号。如果根本没有进程,则只需警告用户。我猜 grep 和 wc 命令对此很有用。

例如,应该是这样的

$ vi & vi &
$ bash file.sh vi SIGINT
vi: 233, 234
$ killall -s KILL vi
$ bash file.sh vi SIGINT
vi: there is no process with that name

我写了这个,但它不适合上面给出的例子

#!/bin/bash
if [ $# -eq 0 ]; then
    echo "No arguments supplied";
elif [ $# -eq 1 ]; then
    num=$(pgrep -c $1);
    echo $num "(the default signal should be used)";
    if [ $num -gt 1 ]; then 
        pidof $1
    elif [ $num -lt 1 ]; then
        echo "Warning: the program doesn't have any processes";
    else
        echo $num and default signal is sigint
        pr=$(pidof $1)
        kill -SIGINT $pr
    fi
else
    echo "(the given signal should be sent to the program)"
fi

任何帮助都将不胜感激。

答案1

这个应该可以达到你的预期

#!/usr/bin/env bash
if [ $# -eq 0 ]; then
    echo "No arguments supplied";
else # at least the process name was passed ($1)
    num=$(pgrep -c -x "$1");
    if [ "$num" -gt 1 ]; then # more than one process found
        pidof "$1"
    elif [ "$num" -lt 1 ]; then
        echo "Warning: the program doesn't have any processes";
    else
        signal=SIGINT # default signal
        if [ $# -ge 2 ]; then # signal provided, use it
            signal=$2
        fi

        pr=$(pidof "$1")
        kill -"$signal" "$pr"
    fi
fi

相关内容