为什么我不能使用execl()运行bash脚本?

时间:2019-05-29 19:56:46

标签: c bash shell raspberry-pi execl

我正在尝试从树莓派上的网站按钮运行bash脚本,该脚本位于home / pi /中。下面的代码片段显示了我当前的解决方案。每当按下网站按钮时,它就会在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块。底部的代码段显示了我是如何实现的。这似乎没有问题(当我按下网站上的按钮时,我就“ ls”为home / pi /,并且有一个名为“ TEST”的新文件夹)。不幸的是,当我运行最上面的代码片段(运行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。我应该能够通过阅读日志文件来验证这一点,但是当我按下网站按钮时,它永远不会更新。

如果您需要任何其他信息,请告诉我!

2 个答案:

答案 0 :(得分:1)

除非您从/运行此行,否则此行在home之前缺少斜杠:

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

此外,execl将永远不会返回。您可能想查询有关fork()exec()模式的信息。

答案 1 :(得分:0)

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