有没有办法设置shell脚本的进程名称?使用killall命令杀死此脚本需要这样做。
答案 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