我创建了一个简单的bash脚本chmod + x,并成功运行它作为后台服务。
但是,当我查看进程列表时,脚本被称为“sh”或“sleep”或者当时正在运行的任何命令,而不是我的脚本名称。
如何命名我的bash脚本的进程,以便区分它?我想确定我没有多次运行脚本。
我是新手来编写脚本...抱歉,如果这是一个愚蠢的问题。
我正在使用#!/ bin / bash
答案 0 :(得分:2)
你的剧本中有“shebang”吗?
我刚做了一点测试。我发现没有shebang,测试脚本在ps
中显示为当时执行的任何命令。但是,如果我像往常一样,把它放在:
#!/bin/bash
或
#!/bin/sh
(在我的系统上符号链接到/bin/dash
)作为脚本的第一行,然后脚本在ps
的输出中以其自己的名称显示。
答案 1 :(得分:1)
因为ps也表明我有预感你运气不好。抱歉,shell脚本无法更改其明显的进程名称。
但是,对于显示bash的情况,您可以使用描述脚本的名称创建一个符号链接,并通过该符号链接调用脚本。
答案 2 :(得分:1)
您的父shell将一直运行。那将是sh。该shell生成的任何其他进程也将运行。尝试使用pstree来显示父子关系。
顺便说一句,如果你使用不在POSIX Bourne shell中的特定于bash的功能,你应该使用#!/ bin / bash,而不是#!/ bin / sh。有些系统有bash,但重量较轻/ bin / sh。我是新手来编写脚本...抱歉,如果这是一个愚蠢的问题。
不傻。基本的,但只有当你理解了Unix进程是如何工作的时候(以及你在OS X中使用的向你显示“服务”名称的方式,因为在这种情况下,这不是一个在任何Unix环境中都有意义的词。)所以你处理的是相当复杂的事情,我不会责怪你提问。
也许OS X会查看流程组的领导者或某些东西来提出“服务名称”,如果这就是它真正称之为的话。我认为这将是前台运行的任何进程的进程名称(即你没有用&在它的末尾分叉,所以shell在执行之前等待它下一个命令。)
答案 3 :(得分:0)
不确定我的解决方案的可移植性如何,但它适用于Linux。
如果你真的想这样做(也许你希望能够通过名字查找来终止你的过程),你可以编写一个小的C程序来调用具有不同进程名称的shell。例如...
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
if (argv[1])
{
argv[0] = argv[1];
return execvp("sh", argv);
}
else
{
fprintf(stderr, "usage: %s <script> [args]\n", argv[0]);
return 1;
}
}
说这叫做wrapper.c。你可以编译:
gcc -o wrapper wrapper.c
然后你可以运行:
./wrapper ./my-script
然后检查top
或ps
。它应该有一个“伪造的”程序名称..
现在......你真的想要这样做吗?我不知道。这可能不值得。大多数人都不会为这类事情烦恼。