Bash Daemon命名为“sh”或“sleep”而不是文件名

时间:2009-12-05 05:04:11

标签: bash process

我创建了一个简单的bash脚本chmod + x,并成功运行它作为后台服务。

但是,当我查看进程列表时,脚本被称为“sh”或“sleep”或者当时正在运行的任何命令,而不是我的脚本名称。

如何命名我的bash脚本的进程,以便区分它?我想确定我没有多次运行脚本。

我是新手来编写脚本...抱歉,如果这是一个愚蠢的问题。

我正在使用#!/ bin / bash

4 个答案:

答案 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

然后检查topps。它应该有一个“伪造的”程序名称..

现在......你真的想要这样做吗?我不知道。这可能不值得。大多数人都不会为这类事情烦恼。