当我编写cronjob,服务脚本或守护命令时,我经常让他们调用bash脚本或运行bash命令。问题是这些命令的执行行为与我在登录shell中运行它们时的行为有所不同。差异归结为环境变量和登录和shell工作方式中的许多其他细微之处,我不明白。
有没有办法运行bash命令,让它们的行为与我登录并运行它们时的行为完全相同。我需要一个简单的过程,我可以设置一个脚本来运行一个bash命令,理想情况下可以在这些情况下工作:
例如,经常运行: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,那么我可以稍后以自动方式杀死它们。
答案 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.