完全像具有shell

时间:2015-06-23 16:34:53

标签: linux bash centos

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

有没有办法运行bash命令,让它们的行为与我登录并运行它们时的行为完全相同。我需要一个简单的过程,我可以设置一个脚本来运行一个bash命令,理想情况下可以在这些情况下工作:

  • 在cronjob中打电话
  • 在服务(init.d / systemd)脚本中调用
  • 作为后台进程运行(例如使用&和nohup) - stderr和stdout的可配置重定向
  • 可配置用户

例如,经常运行: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密钥加载到机器上,我宁愿避免这样做。不确定它是否重要但我的主要目标平台是Centos 6(想要所有* nix的通用解决方案)。

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

2 个答案:

答案 0 :(得分:1)

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

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

你也应该能够获得任何命令的PID ..或者只是让你的进程为你写一个PID文件然后cat($$是shell var来回显任何一个你的shell进程“

答案 1 :(得分:0)

确保调用进程设置了SSH密钥(以便不要求输入密码),然后执行

echo /path/to/some/command | ssh -t -t someuser@localhost

来自ssh手册页:

 -t      Force pseudo-tty allocation.  This can be used to execute arbi‐
         trary screen-based programs on a remote machine, which can be
         very useful, e.g. when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.