我需要编写一个 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