首页 > 解决方案 > 为什么我不能使用 execl() 来运行 bash 脚本?

问题描述

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

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。我应该能够通过阅读日志文件来验证这一点,但是当我按下网站按钮时它永远不会更新。

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

标签: cbashshellraspberry-piexecl

解决方案


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

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

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


推荐阅读