【问题标题】:Bash Daemon Named "sh" or "sleep" not the filenameBash 守护进程命名为“sh”或“sleep”而不是文件名
【发布时间】:2009-12-05 05:04:10
【问题描述】:

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

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

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

我对 bash 脚本非常陌生...抱歉,如果这是一个愚蠢的问题。

我正在使用 #!/bin/bash

【问题讨论】:

  • 澄清一点:chmod +x 不编译任何东西,它只是将文件标记为可执行文件。
  • 您如何识别“服务”?
  • 我只是用“服务”这个术语来表示它在后台运行,stdout 和 stderr 被定向到 dev/null。也许守护进程更好?

标签: bash process


【解决方案1】:

您的脚本中有“shebang”吗?

我只是做了一个小测试。我发现没有shebang,测试脚本在ps 中显示为当时正在执行的任何命令。但是,如果我像往常一样,输入:

#!/bin/bash

#!/bin/sh

(在我的系统上符号链接到/bin/dash)作为脚本中的第一行,然后脚本在ps 的输出中以其自己的名称显示

【讨论】:

  • 我试过了,我在我的盒子上得到了和你一样的结果。你的答案是正确的,解决了问题
【解决方案2】:

您的父 shell 将一直运行。那将是sh。该外壳生成的任何其他进程也将运行。尝试使用 pstree 来显示父子关系。

顺便说一句,如果您使用 POSIX Bourne shell 中没有的特定于 bash 的功能,您应该使用 #!/bin/bash,而不是 #!/bin/sh。一些系统有 bash,但有一个更轻量级的 /bin/sh。

我对 bash 脚本很陌生...抱歉,如果这是一个愚蠢的问题。

不傻。基本的,但只有在您了解 Unix 进程的工作方式之后,(以及您在 OS X 中使用的任何内容如何显示“服务”名称,因为在这种情况下,在任何 Unix 上下文中这不是一个有意义的词。)所以你正在处理相当多的复杂性,我不怪你问。

也许 OS X 会着眼于进程组领导或其他东西来想出一个“服务名称”,如果它真的这么称呼它的话。我认为这将是在前台运行的任何进程的进程名称(即,您没有在其末尾使用 & 分叉,因此 shell 在执行下一条命令。)

【讨论】:

    【解决方案3】:

    因为这也是 ps 也显示的内容,所以我有一种预感,你不走运。抱歉,shell 脚本无法更改其明显的进程名称。

    但是,对于显示 bash 的情况,您可以在描述脚本的名称下创建指向 bash 的符号链接,并通过该符号链接调用您的脚本。

    【讨论】:

    • argv[0] 实际上可以被欺骗成你想要的任何东西。试试看: char *args[] = {"Hello world", NULL}; execvp("sh", args);当然外壳不会暴露这个......
    【解决方案4】:

    不确定我的解决方案的便携性如何,但它可以在 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。它应该有一个“伪造”的程序名称..

    现在...您是否真的想这样做?我不知道。这可能不值得。大多数人都不会为这种事情烦恼。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-20
      • 2013-06-10
      • 2020-05-28
      • 1970-01-01
      • 2023-03-09
      • 2016-02-29
      • 2023-03-02
      • 1970-01-01
      相关资源
      最近更新 更多