web-dev-qa-db-ja.com

プロセスにシグナルを送信するためのbashファイル

プログラムの名前とシグナルの名前を引数として取り、いくつかのことを行うbashプログラムを作成する必要があります。シグナルの名前が指定されていない場合、デフォルトのシグナルはSIGINTになります。

プログラムfile.shは、指定されたプログラム(引数から)にプロセスが1つしかないかどうかを確認する必要があります。その場合、指定されたシグナルをそのプロセスに送信します。さらにプロセスがある場合、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

このための任意の助けは本当にいただければ幸いです。

2
N.john

これはあなたが期待することをするべきです

#!/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
1
Onilton Maciel