我正在寻找一个真实世界的场景,其中使用exec将是唯一可用的选项(如果不使用exec则问题无法解决)
我知道什么是exec以及它与fork有什么不同,但仍然对强制使用exec命令的现实问题感兴趣.
我真的需要用PHP exec关闭ubuntu.但我可能在获得许可时遇到了一些问题.
echo exec('whoami')
Run Code Online (Sandbox Code Playgroud)
返回'没人';
所以我放入了控制台
adduser nobody admin
Run Code Online (Sandbox Code Playgroud)
并尝试过
exec("shutdown -h now");
Run Code Online (Sandbox Code Playgroud)
但它不起作用;(
我的印象(可能是错误的)Perl中的'exec'函数没有返回值(我得到它只是运行命令的印象).情况是Perl脚本在服务器上运行,我需要调用此脚本在Linux机器内运行命令,但也返回结果.如何才能做到这一点?
我必须使用EXEC系列来查找所拥有的进程(用户)并将其写入文件中.
码:
sprintf(buffer, "%d", getpid());
if ((pid = fork()) == -1)
exit(EXIT_FAILURE);
else if (pid == 0)
{
dup2(fd,STDOUT_FILENO);
dup2(fd,STDERR_FILENO);
// function that Write in the file
fdprintf(fd, "\n%s %s%d secondes %s\n", adornment, toShow, sec, adornment);
if (execlp("ps", "u", buffer, NULL) == -1)
show_err("Exelp Error\n");
}
else
{
wait(NULL);
fdprintf(fd, "%s %s%d secondes %s\n", adornment, toShow, sec, adornment);
close(fd);
}
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏!谢谢
您好我使用exec命令编写了简单的java函数.此函数检查系统(linux)中是否存在该字体.首先我写了简单的bash命令:identify -list font | grep -i 'Font: Times-Bold' -w它的工作完美,所以我创建了简单的程序:
public abstract class SystemReader{
public static final void checkFontExist(String name){
String command = "identify -list font | grep -i -w \'Font: " + name + "\'";
Process p =Runtime.getRuntime().exec(command);
String lines = "";
String resoults ="";
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line buferedReader.readLine())!=null){
resoult += line + "\n";
}
System.out.println("RESPONSE: " + resoult);
bufferreader.close();
}
Run Code Online (Sandbox Code Playgroud)
}
它的工作但不是我的意思.此函数返回我系统中存在的所有字体.它似乎命令grep不是exec?
我尝试使用另一个版本的命令exec()我创建:
String command = {"identify -list font", "grep -i …Run Code Online (Sandbox Code Playgroud) int status=0;
int PID = fork();
if(PID == 0)
{
char *path = strcat(pathToken,strcat("/",command));
printf("path: %s\n",path);
execl(path,command,"-l",NULL);
}
else if(PID>0)
{
printf("pid: %d. ",PID);
printf("I'm parent process\n");
wait(&status);
}
Run Code Online (Sandbox Code Playgroud)
输出:
pid: 20027. I'm parent process
Run Code Online (Sandbox Code Playgroud)
为什么不进入if(PID==0)?
关于这段代码
public function invoke($url)
{
exec('wget 2>&1', $output);
print_r($output);
}
Run Code Online (Sandbox Code Playgroud)
什么是2>&1这个命令吗?我在SO上发现了这个,但2>&1没有解释
wget是一个linux命令,我正在使用PHP运行它exec().
上面的代码有效.我只需要$url在正确的位置插入并理解2>&1.
相关链接
我想将exec用法转换为show项目中的方法。因为,当我使用execfor窗口(对话框)时,无法打开另一个窗口。这是exec()和show()方法之间的基本区别。
在exec和show以不同的方式,我想知道我怎么可以使用更改下面的代码工作show(),而不是exec()。
例如:
int result = exampleWindow->exec();
if ( result == QDialogButtonBox::Ok )
{
exampleWindow->UpdateCalibrationData(&data);
exampleWindow->UpdateFilterData(&filterData);
exampleWindow();
}
Run Code Online (Sandbox Code Playgroud) 在以下链接中,以及许多其他类似链接,exec通常被描述为:
exec调用是一种基本上用新程序替换整个当前进程的方法.它将程序加载到当前进程空间并从入口点运行它.
它真的取代了整个程序吗?它不仅仅是执行一个恰好体现main()所选程序的子程序/函数调用吗? - 在返回自己的背景和操作之前?
所以不是更恰当的描述,只是一个体现的子程序main()?(例如,将所选择的流程代码纳入当前的流程中?与完全"替换它"相反?
# original taken from the provided link
+--------+
| pid=7 |
| ppid=4 |
| bash |
+--------+
|
| calls fork
V
+--------+ +--------+
| pid=7 | forks | pid=22 |
| ppid=4 | ----------> | ppid=7 |
| bash | | bash |
+--------+ +--------+
| |
| waits for pid 22 | calls exec to run ls
| V
| +--------+
| | pid=22 |
| …Run Code Online (Sandbox Code Playgroud) 以下工作并打印命令输出:
out, err := exec.Command("ps", "cax").Output()
Run Code Online (Sandbox Code Playgroud)
但是这个失败了(退出状态为1):
out, err := exec.Command("ps", "cax | grep myapp").Output()
Run Code Online (Sandbox Code Playgroud)
有什么建议?