【问题标题】:Why can't I use execl() to run a bash script?为什么我不能使用 execl() 来运行 bash 脚本?
【发布时间】:2019-05-29 19:56:45
【问题描述】:

我正在尝试从树莓派上的网站按钮运行 bash 脚本,该脚本位于 home/pi/ 中。下面的代码 sn-p 显示了我当前的解决方案。每当按下网站按钮时,它都会在 c 文件中调用此代码块。

else if(strcmp(argv[1],"SelfTest") == 0)
    {
        char *command = "/bin/bash";
        char name[40];
        strcpy(name, "home/pi/SelfTest.sh");
        execl(command, command, name, NULL);
        return 0;
    }

我在 Raspberry Pi 3+ 上运行它,我正在运行的脚本有 777 权限,并且归 pi:www-data 所有,如果有帮助的话。

我通过创建一个名为“TEST”的空目录来测试是否真的调用了 IF 块。代码的底部 sn-p 显示了我是如何解决这个问题的。这似乎可以正常工作(只要我按下网站上的按钮,我就会出现“ls”home/pi/ 并且那里有一个名为“TEST”的新文件夹)。不幸的是,当我运行代码的顶部 sn-p(运行 SelfTest.sh)时,脚本没有运行(脚本本身应该将输出记录到带有时间戳的日志文件中,并且按下按钮不会更新时间戳。仅当我从终端运行脚本时,时间戳才会更新)

else if(strcmp(argv[1],"SelfTest") == 0)
    {
        char *command = "/bin/mkdir";
        char name[40];
        strcpy(name, "/home/pi/TEST");
        execl(command, command, name, NULL);
        return 0;
    }

每次我按下网站按钮时应该发生的事情是它应该运行 SelfTest.sh。我应该能够通过阅读日志文件来验证这一点,但是当我按下网站按钮时它永远不会更新。

如果您需要任何额外信息,请告诉我!

【问题讨论】:

  • 尝试将 stdout 和 stderr 重定向到一个文件,看看是否生成任何错误消息。
  • 为什么会有strcpy?你可以使用char const* name = "/home/pi/SelfTest.sh";

标签: c bash shell raspberry-pi execl


【解决方案1】:

除非您从/ 运行此代码,否则此行在home 之前缺少一个斜线:

strcpy(name, "home/pi/SelfTest.sh");

另外,execl 永远不会回来。您可能需要查找有关 fork()exec() 模式的信息。

【讨论】:

  • 小修正:execl 可以在执行文件出错时返回(与原始版本一样)。
【解决方案2】:

显然我超级笨拙,没有意识到我不需要 bash。我改变了 'char *command = "/bin/bash";' to 'char *command = "/bin/sh";'脚本按预期运行!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-12
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2010-10-15
    相关资源
    最近更新 更多