标签: exec

为什么使用“nohup &”而不是“exec &”

我知道,nohup作为一个二进制文件,它可以从任何 shell 访问。但是exec内置的可能存在于每个 shell 中。

是否有理由更喜欢其中一个?

nohup exec

71
推荐指数
2
解决办法
19万
查看次数

使用 exec 和 tee 同时将日志重定向到 stdout 和日志文件

在 bash 脚本中,如何使用 将所有标准输出重定向到日志文件和tee屏幕上的输出exec

log_file="$HOME/logs/install.txt-`date +'%Y-%m-%d_%H-%M-%S'`"
[ -f "$log_file" ] || touch "$log_file"
exec 1>> $log_file 2>&1
Run Code Online (Sandbox Code Playgroud)

此代码将所有日志重定向到日志文件而不是屏幕。

bash logs tee exec

42
推荐指数
2
解决办法
9万
查看次数

当我在我的 shell 中执行一个文件时到底发生了什么?

所以,我以为我对此有一个很好的理解,但只是进行了一个测试(以回应我不同意某人的对话)并发现我的理解有缺陷......

尽可能详细地说明当我在 shell 中执行文件时到底发生了什么?我的意思是,如果我输入:./somefile some arguments进入我的 shell 并按回车键(并且somefile存在于 cwd 中,并且我有读取+执行权限somefile),那么引擎盖下会发生什么?

以为答案是:

  1. 外壳程序对 进行系统调用exec,将路径传递给somefile
  2. 内核检查somefile并查看文件的幻数,以确定它是否是处理器可以处理的格式
  3. 如果幻数表明文件是处理器可以执行的格式,那么
    1. 创建一个新进程(在进程表中有一个条目)
    2. somefile被读取/映射到内存。创建堆栈并执行跳转到代码的入口点somefile,并ARGV初始化为参数数组 (a char**, ["some","arguments"])
  4. 如果幻数是shebang,exec()如上所述生成一个新进程,但使用的可执行文件是shebang(例如/bin/bash/bin/perl)引用的解释器并somefile传递给STDIN
  5. 如果文件没有有效的幻数,则会出现“无效文件(错误的幻数):Exec 格式错误”之类的错误

但是有人告诉我,如果文件是纯文本,那么 shell 会尝试执行命令(就像我输入了bash somefile)。我不相信这一点,但我只是尝试了一下,结果是正确的。所以我显然对这里实际发生的事情有一些误解,并想了解机制。

当我在我的 shell 中执行一个文件时到底发生了什么?(尽可能多的细节是合理的......)

shell kernel exec shebang

38
推荐指数
3
解决办法
5761
查看次数

在包装脚本中执行 exec 的原因

我看过包装脚本示例,简而言之如下:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

exec "$myprog" "$@"
Run Code Online (Sandbox Code Playgroud)

如上所示,它们exec几乎立即用$myprog. 一个人可以在没有exec

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

"$myprog" "$@"
Run Code Online (Sandbox Code Playgroud)

在最后一个示例中,启动了一个新的 bash 实例,然后$myprog作为 bash 实例的子进程启动。

第一种方法有什么好处?

shell scripting bash shell-script exec

35
推荐指数
2
解决办法
7618
查看次数

'exec {fd}</dev/watchdog' 在 Bash 中有什么作用

那是字面意思,{fd}不是占位符。我有一个执行此操作的脚本,并且不引用任何内容,也不引用其他任何地方的 {fd}。这是有效的 bash 吗?

exec {fd}</dev/watchdog

bash io-redirection exec

30
推荐指数
3
解决办法
4319
查看次数

如何“正确”从 shell 启动应用程序

我发现很难准确地表达这个问题,但我会尽力而为。我dwm用作我的默认窗口管理器和dmenu作为我的应用程序启动器。除了浏览器,我几乎不使用 GUI 应用程序。我的大部分工作都是直接从命令行完成的。此外,我非常喜欢操作系统、应用程序等方面的极简主义。我从未摆脱过的工具之一是应用程序启动器。主要是因为我对应用程序启动器的工作方式/它们的作用缺乏准确的了解。即使是广泛的互联网搜索也只能得到模糊的解释。我想要做的是摆脱我的应用程序启动器,因为除了实际生成应用程序之外,我完全没有用它。为了做到这一点,我真的很想知道如何从外壳“正确”启动应用程序。因此,“正确地”的含义可以近似为“就像应用程序启动器会做的那样”。

我知道以下从 shell 生成进程的方法:

  1. exec /path/to/Program 用指定的命令替换 shell 而不创建新进程
  2. sh -c /path/to/Program 启动 shell 依赖进程
  3. /path/to/Program 启动 shell 依赖进程
  4. /path/to/Program 2>&1 & 启动外壳独立进程
  5. nohup /path/to/Program & 启动独立于 shell 的进程并将输出重定向到 nohup.out

更新 1:我可以说明例如在不同条件下dmenu从重复调用中重建它的内容ps -efl。它生成一个新的 shell/bin/bash并且作为这个 shell 的子应用程序/path/to/Program。只要孩子在身边,贝壳就会在身边。(它如何管理这超出了我的能力......)相反,如果你nohup /path/to/Program &从一个 shell发出,/bin/bash那么程序将成为这个 shell 的子进程,但是如果你退出这个 shell,程序的父进程将是最上层的进程。因此,如果第一个进程是 eg/sbin/init verbose并且它有,PPID 1那么它将是程序的父进程。这里就是我试图用一个图表来解释:chromium推出通过dmenufirefox使用推出exec firefox & exit

systemd-+-acpid
        |-bash---chromium-+-chrome-sandbox---chromium-+-chrome-sandbox---nacl_helper …
Run Code Online (Sandbox Code Playgroud)

shell exec

27
推荐指数
3
解决办法
13万
查看次数

POSIX 是否保证任何标准实用程序的路径?

在 C 中,运行标准实用程序(例如 ps)而不是其他的最简单方法是什么?

例如,POSIX 是否保证存在标准ps/bin/ps或者我应该将 PATH 环境变量重置为我所获得的值confstr(_CS_PATH, pathbuf, n);,然后通过 PATH-search 运行该实用程序?

c path posix exec

25
推荐指数
1
解决办法
3198
查看次数

是否有设置目标应用程序的第零个参数的 POSIX 方法?

bash你可以用exec -azsh你也可以替代设置ARGV0具有一定的第0个参数来执行程序,但也有这样做的POSIX方式?

正如这条评论中所建议的您可以创建一个(临时)符号链接来实现这一点,但这样我就无法将新的第零个参数值设置为真正的任意值,例如具有特定绝对路径的命令。那么有没有其他解决办法呢?

shell shell-script posix exec

21
推荐指数
2
解决办法
1810
查看次数

Linux Ubuntu 上的 php shell_exec() 权限

我正在使用 Linux 服务器开发一个 php 应用程序。我的问题是执行shell_exec()调用某些 exe 文件不起作用(实际上不是 exe,它是一种 linux 可执行文件)

echo shell_exec("whoami");
Run Code Online (Sandbox Code Playgroud)

我有守护进程

echo shell_exec("ls")
Run Code Online (Sandbox Code Playgroud)

我有一些文件名但是

echo shell_exec("php -v")
Run Code Online (Sandbox Code Playgroud)

我什么都没有,一个空白页

echo shell_exec("php ....bla bla bla")
Run Code Online (Sandbox Code Playgroud)

也是空白页。

如果我在终端(用户 hu)上输入,所有这些命令都将起作用。我已经在谷歌上搜索了几个小时,人们说这是因为许可。我没有在 Linux 上的经验。我必须做什么才能在 php 中执行我的程序?

linux shell php exec

18
推荐指数
2
解决办法
15万
查看次数

fork 和 exec 是如何工作的?

我没有太多经验,只是试图参与他们如何从用户级别解释到硬件的过程。

因此,当从 shell 触发命令时,fork()继承它exec()的子进程并将子进程加载到内存中并执行。

  1. 如果子进程包含了父进程(也就是原始进程)的所有属性,那么这个子进程需要什么?原始进程也可能已加载到内存中。
  2. 这个forkexec概念是否适用于 UNIX 中的所有可执行程序?也喜欢shell脚本还是只喜欢命令?它是否也适用于 shell 内置命令?
  3. 如果我将执行命令/脚本,何时使用复制概念?

很抱歉一次问了很多问题,但是当我想到任何命令执行时,所有这些问题都会立刻浮现在我的脑海中。

fork exec

17
推荐指数
3
解决办法
2万
查看次数

标签 统计

exec ×10

shell ×5

bash ×3

posix ×2

shell-script ×2

c ×1

fork ×1

io-redirection ×1

kernel ×1

linux ×1

logs ×1

nohup ×1

path ×1

php ×1

scripting ×1

shebang ×1

tee ×1