如何运行一些需要`source~/.bashrc`的程序,并使用upstart在tmux内部启动这些程序?

如何运行一些需要`source~/.bashrc`的程序,并使用upstart在tmux内部启动这些程序?,bash,ubuntu-12.04,tmux,upstart,Bash,Ubuntu 12.04,Tmux,Upstart,我有一些程序需要source~/.bashrc,应该在使用upstart的tmux内部启动。 因此,我编写了以下测试程序,当我通过initctl start xxx手动启动这些守护进程时,它可以工作,但在启动时它不能工作 我正在使用Ubuntu 12.04 有人有解决办法吗 测试程序 3个测试配置脚本 eisoku@server:~$cat/etc/init/start-tmux.conf 说明“tmux守护程序” 在已启动的网络管理器上启动 在运行级别停止[!2345] 乌马斯克022 尼

我有一些程序需要
source~/.bashrc
,应该在使用upstart的tmux内部启动。 因此,我编写了以下测试程序,当我通过
initctl start xxx
手动启动这些守护进程时,它可以工作,但在启动时它不能工作

我正在使用Ubuntu 12.04

有人有解决办法吗

测试程序
  • 3个测试配置脚本
eisoku@server:~$cat/etc/init/start-tmux.conf
说明“tmux守护程序”
在已启动的网络管理器上启动
在运行级别停止[!2345]
乌马斯克022
尼斯-5
剧本
sudo-iu-eisoku/bin/bash-i-c'source~/.bashrc&&bash~/Desktop/util/start-tmux.bash'&
手表-n 100 ls
结束脚本
eisoku@server:~$cat/etc/init/test-a.conf
说明“测试守护程序”
启动tmux时启动
停止启动tmux时停止
乌马斯克022
剧本
sudo-iu-eisoku/bin/bash-i-c“source~/Desktop/util/tmux-patch.bash&&tmux-newwindowtest-a htop”&
手表-n 100 ls
结束脚本
eisoku@server:~$cat/etc/init/test-b.conf
说明“测试b后台程序”
启动tmux时启动
停止启动tmux时停止
乌马斯克022
剧本
sudo-iu-eisoku/bin/bash-i-c“source~/Desktop/util/tmux-patch.bash&&tmux-newwindowtest-b top”&
手表-n 100 ls
结束脚本
  • util脚本
eisoku@server:~$cat~/Desktop/util/start-tmux.bash
#!/bin/bash
会话名称=`hostname`
tmux新会话-d-s$session\u NAME-n tmp
eisoku@server:~$cat~/Desktop/util/tmux-patch.bash
#!/bin/bash
tmux-newwindow(){
如果[`tmux列表窗口| grep“$1”| cut-d'-f2`],则
echo$1“已存在”
其他的
tmux新窗口-k-n$1-t`hostname`
tmux发送键-t`hostname`:$1${@:2}C-m
fi
}
tmux-killwindow(){
如果[`tmux列表窗口| grep“$1”| cut-d'-f2`],则
tmux杀死窗口-t$1
其他的
echo$i“不存在”
fi
}
结果
eisoku@local-个人电脑:~$ssheisoku@server
欢迎使用Ubuntu 12.04.5 LTS(GNU/Linux 3.11.0-26-generic x86_64)
eisoku@server:~$sudo重新启动
重启后

eisoku@local-个人电脑:~$ssheisoku@server 
欢迎使用Ubuntu 12.04.5 LTS(GNU/Linux 3.11.0-26-generic x86_64)
eisoku@server:~$tmux列表窗口
0:tmp[80x23][b85e布局图,80x23,0,0](激活)
eisoku@server:~$
eisoku@server:~$initctl状态启动tmux
启动tmux启动/运行,进程1030
eisoku@server:~$initctl状态测试-a
测试a启动/运行,过程1033
eisoku@server:~$initctl状态测试-b
测试b启动/运行,过程1031
当守护进程的状态正在运行时,test-a和test-b似乎没有像我预期的那样工作

但是,当我手动启动这些守护进程时,它会工作

eisoku@server:~$sudo initctl重新启动测试-a
测试a启动/运行,过程3369
eisoku@server:~$sudo initctl重新启动测试-b
测试b启动/运行,过程3461
eisoku@server:~$tmux列表窗口
0:tmp[80x23][布局图b85e,80x23,0,0]
1:test-a[80x23][布局图b85e,80x23,0,0]
2:test-b[80x23][布局图b85e,80x23,0,0](激活)

我已经解决了自己的问题。这是因为Upstart并行运行作业,Upstart尝试启动test—一个在Upstart启动tmux作业之后启动的作业,所以在本例中由start tmux作业启动的tmux并没有完全启动

我可以通过使用pre-start等待tmux启动,并让test-b作业链像这样测试-a来解决这个问题




~
在这些情况下没有您期望的值。不要用它。使用显式路径。感谢您的回复,但我不这么认为,因为我使用的交互式shell是这样的
sudo-iu my name/bin/bash-I-c'command'
。然后尝试使用
$HOME
~
扩展不同于变量扩展。
~
$HOME
在我发布时手动启动守护程序时都可以工作,如果您将stdout和stderr从test-a和test-b中的shell代码段重定向到日志文件,那么您会从启动尝试中看到什么?
eisoku@server:~$ cat /etc/init/test-a.conf 
description "test a daemon"

start on started start-tmux
stop on stopped start-tmux
umask 022

pre-start script
     /bin/sleep 1
end script

script
     sudo -iu eisoku /bin/bash -i -c "source ~/Desktop/util/tmux-patch.bash && tmux-newwindow test-a htop" &
     watch -n 100 ls
end script
eisoku@server:~$ cat /etc/init/test-b.conf 
description "test b daemon"

start on started test-a
stop on stopped start-tmux
umask 022

pre-start script
     /bin/sleep 1
end script

script
     sudo -iu eisoku /bin/bash -i -c "source ~/Desktop/util/tmux-patch.bash && tmux-newwindow test-b top" &
     watch -n 100 ls
end script