天道酬勤,学无止境

exec

PHP exec() 和路径中的空格(PHP exec() and spaces in paths)

问题 我在 PHP 应用程序中执行以下操作: $source = '/home/user/file.ext'; $output_dir = $this->setOutputString(); chdir('/home/ben/xc/phplib/bgwatcher-2011a/a01/'); exec('php bin/createjob.php $source $output_dir', $output); return $output[0]; 问题是这样的:我可以控制$source ,但不能控制$output_dir ,这是一个旧的 Windows 文件系统,并且路径中有空格。 $output_dir一个例子是: /home/vol1/district id/store id/this_is_the_file.html 将输出字符串插入exec()函数时,我都尝试过: addslashes($output_dir)和'"' . $output_dir . '"'转义整个输出字符串。 在第一种情况下,路径连接到: /home/vol1/districtthis_is_the_file.html ...其中第一个空格和文件名之间的所有内容都被删除。 在第二种情况下, exec()似乎抛出了一个鞋子并且没有正确执行 - 不幸的是,错误消息在机器中丢失 - 如果绝对必要,我可以提供它

2021-12-05 00:51:03    分类:技术分享    php   path   exec

有人可以解释一下这个 bash 末尾符号的内部工作原理:“_ {} \;”(Can someone explain the inner working of the symbols at the end of this bash: “_ {} \;”)

问题 我在 shell 中运行以下命令将.HEIC文件批量转换为.JPG文件,命令成功,但是有一部分我不明白: find . -name '*.HEIC' -exec sh -c 'magick convert $1 "${1%.HEIC}.JPG"' _ {} \; 显然_ {}用于将find结果分配给$1 ,但是如何? 我在 google 和 here 上都找不到解释,并且man find没有任何运气。 答案完全有可能在这里,但这些符号不太好搜索。 所以问题是, _ {}如何将变量赋值给$1 ? 是否可以使用 find/ 或其他命令为其分配多个变量? 回答1 _ {}如何将文件名分配给$1涉及两件事。 首先,是find的-exec工作原理:它运行以下参数(直到转义的; )作为命令,但用它找到的文件的路径替换{} 。 因此,如果它找到./somefile.HEIC ,它将运行等效的命令: sh -c 'magick convert $1 "${1%.HEIC}.JPG"' _ ./somefile.HEIC 第二部分是sh命令。 sh可以做很多事情,但是如果给它一个-c选项,它会将紧随其后的参数( magick convert $1 "${1%.HEIC}.JPG" )作为命令字符串来解析和运行,有点像就像一个小脚本。 之后的参数被视为该迷你脚本的参数,从$0开始。 在这种情况下

2021-12-03 14:01:08    分类:技术分享    bash   shell   find   exec

如果我有一个进程,并且我克隆了它,PID 是否相同?(If I have a process, and I clone it, is the PID the same?)

问题 只是一个简单的问题,如果我克隆一个进程,克隆进程的 PID 是一样的,是吗? fork() 创建一个子进程,其中 PID 不同,但其他一切都相同。 Vfork() 创建一个具有相同 PID 的子进程。 Exec 致力于将当前正在执行的进程更改为其他进程。 我在所有这些陈述中都正确吗? 回答1 fork()和vfork()不会保持相同的 PID,尽管clone()可以在一种情况下(*a) 。 它们都是不同的方式来实现大致相同的目的,创造一个独特的孩子。 clone()类似于fork()但是两个进程共享很多东西,这通常用于启用线程。 vfork()是clone一种变体,其中父进程暂停,直到子进程退出或执行另一个程序。 在这些情况下它更有效,因为它不涉及复制页表等。 基本上,只要孩子需要加载另一个程序,这两个进程之间就会共享所有内容。 将最后一个选项与共享内存本身(直到其中一个进程写入它)但引用该内存的页表被复制的普通写时复制进行对比。 换句话说, vfork()甚至比写时复制更有效,至少对于 fork-followed-by-immediate-exec 用例而言。 但是,在大多数情况下,子进程与父进程具有不同的进程 ID。 *a使用CLONE_THREAD clone()时,事情会变得棘手。 在那个阶段,进程仍然具有不同的标识符,但构成 PID 的内容开始变得模糊。

2021-12-02 20:33:25    分类:技术分享    linux   exec   fork   pid

将文本附加到 bash 中的 stderr 重定向(Append text to stderr redirects in bash)

问题 现在我正在使用 exec 将 stderr 重定向到错误日志 exec 2>> ${errorLog} 唯一的缺点是我必须用时间戳开始每次运行,因为 exec 只是将文本直接推送到日志文件中。 有没有办法重定向 stderr 但允许我向其附加文本,例如时间戳? 回答1 这是非常有趣的。 我问过一个非常了解 bash 的人,他是这样告诉我的: foo() { while IFS='' read -r line; do echo "$(date) $line" >> file.txt; done; }; 首先,它创建了一个从标准输入读取一行原始输入的函数,而对 IFS 的赋值使它不会忽略空白。 读取一行后,它会输出它并预先添加适当的数据。 然后你必须告诉 bash 将 stderr 重定向到该函数: exec 2> >(foo) 您写入 stderr 的所有内容现在都将通过 foo 函数。 请注意,当您在交互式 shell 中执行此操作时,您将不会再看到提示,因为它已打印到 stderr,并且 foo 中的读取是行缓冲的 :) 回答2 你可以简单地使用: exec 1> >( sed "s/^/$(date '+[%F %T]'): /" | tee -a ${LOGFILE}) 2>&1 这不会完全解决您关于未显示提示的问题(它会在很短的时间后显示,但不是实时显示

2021-12-01 09:17:57    分类:技术分享    bash   exec   stderr

为什么在指定本地人时 Python 3 exec() 失败?(Why does Python 3 exec() fail when specifying locals?)

问题 以下在 Python 3 中执行没有错误: code = """ import math def func(x): return math.sin(x) func(10) """ _globals = {} exec(code, _globals) 但是,如果我也尝试捕获局部变量 dict ,则会失败并显示NameError : >>> _globals, _locals = {}, {} >>> exec(code, _globals, _locals) --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-9-aeda81bf0af1> in <module>() ----> 1 exec(code, {}, {}) <string> in <module>() <string> in func(x) NameError: name 'math' is not defined 为什么会发生这种情况,如何在捕获全局变量和局部变量的同时执行此代码? 回答1 从 exec() 文档: 请记住,在模块级别,全局变量和本地变量是同一个字典。

2021-11-30 19:24:22    分类:技术分享    python   python-3.x   exec   python-exec

什么会导致 exec 失败? 接下来发生什么?(What can cause exec to fail? What happens next?)

问题 exec(execl、execlp 等)失败的原因是什么? 如果您调用 exec 并返回,除了恐慌和调用 exit 之外,还有其他最佳实践吗? 回答1 处理exec失败的问题是通常exec是在子进程中执行的,而你想在父进程中做错误处理。 但是您不能只是exit(errno)因为(1)您不知道错误代码是否适合退出代码,以及(2)您无法区分exec失败和新程序的失败退出代码你exec 。 我知道的最好的解决方案是使用管道来传达exec的成功或失败: 在 fork 之前,在父进程中打开一个管道。 分叉后,父进程关闭管道的写端,从读端读取。 子进程关闭读取端并为写入端设置 close-on-exec 标志。 孩子调用exec。 如果 exec 失败,子进程使用管道将错误代码写回父进程,然后退出。 如果子exec成功执行exec ,则父进程读取 eof(零长度读取),因为 close-on-exec 使成功的exec关闭管道的写入端。 或者,如果exec失败,则父级读取错误代码并可以相应地继续。 无论哪种方式,父进程都会阻塞,直到子exec调用exec 。 父级关闭管道的读取端。 回答2 从 exec(3) 手册页: execl() 、 execle() 、 execlp() 、 execvp()和execvP()函数可能会失败并为库函数execve(2)和malloc(3

2021-11-30 07:27:08    分类:技术分享    c   linux   unix   exec

如何检索 PHP exec() 错误响应?(How to retrieve PHP exec() error responses?)

问题 下面是我尝试执行的命令,但没有成功: exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess'); 当你在最后添加一个 die() 时,它会发现有一个错误: exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess') or die('what?!'); 对于上面的 exec() 语句,权限问题导致了错误,但 PHP 没有显示它。 你如何从 PHP 显示发生了什么错误? 回答1 以下代码将捕获正常输出(来自 StdOut)和错误输出(来自 SdtErr)。 exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess 2>&1',$output); var_dump($output); 回答2 如果调用程序将输出输出到 STDERR,则 $output 参数似乎不起作用。 处理此问题的更好方法是将 exec 的输出重定向到一个文件,然后在出现错误情况时显示该文件的内容。 如果 $cmd 持有 exec 命令,则添加如下内容: $cmd.=" > $error_log 2>&1" 然后检查 $error_log 中 filespec

2021-11-30 03:17:46    分类:技术分享    php   shell   exec

使用 php 剪切 flv 视频(To cut flv video using php)

问题 我正在尝试提供 30 秒的高级视频预览(用户必须付费才能完整观看)。 所以我想在上传这些视频时创建一个 30 秒的视频文件。 我使用 ffmpeg 如下,但它不起作用。 ffmpeg -ss 00:00:00.0 -t 00:00:30.0 -i input.flv -acodec copy -vcodec copy -async 1 output.flv 提前致谢 回答1 @shinod,我已经在我的电脑上测试过了。 这是工作。 ffmpeg -ss 00:00:00.01 -t 00:00:30.00 -i input.flv -acodec copy -vcodec flv -async 1 output.flv 将-vcodec copy替换为-vcodec flv

2021-11-29 20:22:49    分类:技术分享    php   ffmpeg   exec

通过 exec 在 find 的输出上替换 Bash 变量(Bash variable substitution on find's output through exec)

问题 有没有办法在find的输出上应用bash变量替换? 我知道我已经看到有人在堆栈溢出时这样做了,但我似乎再也找不到那个特定的帖子了。 例如,假设我想将文件*.png重命名为*_copy.png 。 我知道我可以使用rename来做到这一点,但这只是一个思想实验。 现在我希望能够做这样的事情: find . -name "*png" -exec mv "{}" "${{}%.*}_copy.png" \; 这会导致无效替换。 当然,我可以先将输出分配给一个变量,然后在子 shell 中应用替换,但这真的是唯一的方法吗? find . -name "*.png" -exec bash -c 'var="{}"; mv "{}" "${var%.*}_copy.png"' \; 或者有什么方法可以直接从{}实现? 共识 正如Etan Reisner所说,处理 find 输出的更好、更安全的方法是将其作为位置参数传递。 find . -name "*.png" -exec bash -c 'mv "$0" "${0%.*}_copy.png"' "{}" \; 回答1 我花了一段时间才弄明白这个问题。 基本上你在问是否像: echo "${test.png%.png}" 可用于获取单词test 。 答案是不。 以${开头的字符串操作运算符是参数替换运算符的子集。 它们仅适用于变量

2021-11-29 18:41:22    分类:技术分享    bash   find   exec   substitution   built-in

使用从命令行运行的命令在 Java 中使用 exec 编译和执行失败(Compiling and executing using exec in Java fails using command that works from the command line)

问题 所以这个想法是下面代码中的这一行 Runtime.getRuntime().exec("cd /Users/fnord/Documents/workspace/LearningJava/src/PackA/; javac classA.java; cd ..; java PackA.classA"); 应该和这条线做同样的事情 cd /Users/fnord/Documents/workspace/LearningJava/src/PackA/; javac classA.java; cd ..; java PackA.classA 当第二行从终端运行时。 即编译运行java代码。 我误解了 exec() 的工作原理吗? 如果是这样,完成我想要完成的工作的最佳方法是什么? package PackA; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; public class classA { public static void main(String[] args) throws Exception{ ClassLoader loader =

2021-11-29 03:32:59    分类:技术分享    java   shell   file-io   exec