如何设置shell脚本的进程名称?

时间:2010-06-19 13:39:28

标签: shell scripting process

有没有办法设置shell脚本的进程名称?使用killall命令杀死此脚本需要这样做。

10 个答案:

答案 0 :(得分:22)

这是一种方法,它是一个黑客/解决方法,但它的工作非常好。您可以随意根据自己的需要调整它,它肯定需要对符号链接创建进行一些检查或使用tmp文件夹来避免可能的竞争条件(如果它们在您的情况下有问题)。

示范

<强> 包装

#!/bin/bash
script="./dummy"
newname="./killme"

rm -iv "$newname"

ln -s "$script" "$newname"

exec "$newname" "$@"

<强> 虚设

#!/bin/bash
echo "I am $0"
echo "my params: $@"

ps aux | grep bash

echo "sleeping 10s... Kill me!"
sleep 10

使用以下方法测试:

chmod +x dummy wrapper
./wrapper some params

在另一个终端中,使用以下命令将其删除:

killall killme

备注

确保您可以在当前文件夹(当前工作目录)中书写。

如果您当前的命令是:

/path/to/file -q --params somefile1 somefile2

包装 中的 脚本 变量设置为 / path / to / file (而不是 ./ dummy )并像这样调用 包装

./wrapper -q --params somefile1 somefile2

答案 1 :(得分:2)

据我所知,你不能可靠,便携地做到这一点。在Unix的某些版本中,更改argv [0]中的内容将完成这项工作。不过,我不相信大多数贝壳都有办法做到这一点。

以下是有关该主题的一些参考资料。

答案 2 :(得分:1)

您可以在PID上使用kill命令,这样您可以在后台运行某些内容,获取其ID并将其终止

可以使用$!获取后台最后一次作业的PID。

echo test & echo $!

答案 3 :(得分:1)

您都可以在pgrep / pkill中使用-f标志,这将搜索整个命令行,而不仅仅是进程名称。例如

./script &
pkill -f script

答案 4 :(得分:0)

至少在Linux上,killall dvb即使dvb是标有#!的shell脚本也能正常工作。唯一的技巧是使脚本可执行并通过名称调用它,例如,

dvb watch abc write game7 from 9pm for 3:30

正在运行ps会显示名为

的进程
/usr/bin/lua5.1 dvb watch ...

killall dvb将其删除。

答案 5 :(得分:0)

%1,%2 ......也做得很好:

#!/bin/bash
# set -ex

sleep 101 &
FIRSTPID=$!
sleep 102 &
SECONDPID=$!

echo $(ps ax|grep "^\(${FIRSTPID}\|${SECONDPID}\) ")
kill %2
echo $(ps ax|grep "^\(${FIRSTPID}\|${SECONDPID}\) ")
sleep 1
kill %1
echo $(ps ax|grep "^\(${FIRSTPID}\|${SECONDPID}\) ")

答案 6 :(得分:0)

这实际上非常简单而且非常容易。

以下命令会将脚本添加到后台,该脚本具有自定义进程名称CUSTOM-NAME

( exec -a "CUSTOM-NAME" /bin/bash ) </path/to/script.sh &

一些注意事项:

  • ps将无法以CUSTOM-NAME的身份引用该进程-即使将其显示为CUSTOM-NAME,它也会在内部将其视为bash。因此,命令

    ps h -C "CUSTOM-NAME" -o pid=
    

    将不返回该进程的PID。要通过名称获取PID,必须执行以下操作(请注意您的grep版本-它必须支持PCRE才能起作用!):

    ps h -C bash -o pid= -o cmd= | grep -m1 -oP "[0-9]+(?=\s+CUSTOM-NAME)"
    
  • 强制bash在启动时从stdin读取整个脚本很重要,这样脚本内的任何类型的0文件描述符重定向都不会影响脚本的读取。这样做,将整个脚本包含在{}中,如下所示:

    ( exec -a "CUSTOM-NAME" /bin/bash ) <<EOF &
    {
     $(cat /path/to/script.sh)
    }
    EOF
    

答案 7 :(得分:0)

这是一个非常古老的帖子。可以肯定的是,原始海报早就得到了他/她的回答。但是对于新来者来说,我想解释一下自己的经历(玩bash半小时后)。如果您通过带有以下名称的脚本名称启动脚本:

./script.sh

ps列出的进程名称将是“ bash”(在我的系统上)。但是,如果您通过直接调用bash启动脚本,则:

/bin/bash script.sh /bin/sh script.sh bash script.sh

您最终将获得一个包含脚本名称的进程名称。例如:

/bin/bash script.sh

导致具有相同名称的进程名称。这可以用来标记具有特定脚本名称的PID。并且,这对于(例如)使用kill命令来停止所有进程名称包含所述脚本名称的进程(通过pid)很有用。

答案 8 :(得分:-1)

嗯...除非我误解了这个问题,否则shell脚本的名称就是你命名文件的名字。如果您的脚本名为foo,则killall foo会将其终止。

答案 9 :(得分:-1)

除非使用shebang覆盖脚本名称,否则我们将无法使用“ NoiseSuppressor”找到外壳脚本的pid。尽管所有正在运行的Shell脚本都是对ps -ef | grep {scriptName}的响应。但这将变得难以识别正在运行的进程,因为将同时运行多个bash处理。

因此,更好的方法是为shell脚本命名。

编辑shell脚本文件并使用shebang(第一行)来命名进程,例如"ps -ef | grep bash"

这样,我们将能够使用

grep scriptName的进程ID。
#!/bin/bash /scriptName.sh