gpt4 book ai didi

linux - 完全像使用 shell 的用户一样运行脚本

转载 作者:太空狗 更新时间:2023-10-29 12:29:45 26 4
gpt4 key购买 nike

当我编写 cronjob、服务脚本或守护命令时,我经常让它们调用 bash 脚本或运行 bash 命令。问题是这些命令的执行行为与我在登录 shell 中运行它们时的行为不同。差异归结为环境变量和登录和 shell 工作方式中的许多其他细微之处,我不明白。

有没有一种方法可以运行 bash 命令并让它们的行为与我登录并运行它们时的行为完全一样。我需要一个万无一失的流程,我可以在其中设置一个脚本来运行可以在这些情况下理想地工作的 bash 命令:

  • 在 cronjob 中调用
  • 在服务 (init.d/systemd) 脚本中调用
  • 作为后台进程运行(比如使用 & 和 nohup)-可配置的标准错误和标准输出重定向
  • 可配置的用户

例如,经常运行:su -c 'nohup $MY_CMD >/var/log/out.txt 2>&1 &' $MY_USER 导致应用程序出错,而不是 shell命令本身,因为应用程序以不同的方式对待在 shell 和非 shell 中执行的命令。如何让应用程序认为它是通过登录 shell 调用的?

虽然这种方法当然不是面向生产或安全的,但我经常发现自己在最后一刻的情况下,我必须以特定用户的身份在后台自动运行命令(并且只需要一个小时来弄清楚)并且命令本身只有在我在 shell 中手动运行时才有效。

我还想避免使用通过 ssh 连接传递命令,或者完全避免调用 ssh 连接。 ssh $USER@127.0.0.1 '$CMD' 之类的东西会要求我将 ssh key 加载到机器上,而我宁愿避免这样做。不确定这是否重要,但我的主要目标平台是 Centos 6(想要一个适用于所有 *nix 的通用解决方案)。

如果我还可以捕获脚本生成的所有进程的 PID,那么我可以在以后以自动方式杀死它们,这会加分。

最佳答案

查看 runuser 命令,您可以在初始化脚本等中使用它。
您也可以在 crons 中使用它。

/sbin/runuser "$USER" -s /bin/sh -c "cd $BASEDIR && exec $CMD start > $STDOUTLOG 2> $STDERRLOG &"

你也应该能够获得任何命令的 PID.. 或者只是让你的进程为你写一个 PID 文件并 cat 它( $$ 是要回显的 shell var在你的任何 shell 进程之外”

关于linux - 完全像使用 shell 的用户一样运行脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31008497/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com