我将 Ubuntu 16.04 与 Bash 一起使用,并且我有一个包含许多不同函数的文件。在这些函数之间,有一个:
tdm() {
chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/
sleep 2h
chmod -R 000 "$drt"/phpmyadmin/
tmux kill-session
}
这个功能存在是因为我安装了 phpmyadmin (PMA) 之后,限制出于chmod /usr/share/phpmyadmin 000 -R
安全原因,上面的函数使用我暂时允许 PMA 2 小时(2 小时通常足以让我在数据库中进行更改)。因此得名 TDM(临时数据库管理)。
请注意,该函数没有调用。它没有,因为我tdm
在获取包含它的文件后,通过执行直接从 CLI 调用它。
我的问题
我的问题是sleep
函数内的命令阻止我使用控制台(任何前台更改都将停止sleep
)。
因此,我需要tdm
在分离会话中执行tmux
,它将把权限更改为755
/ 644
,sleep
2小时(不会中断我在控制台中的工作),然后它将再次锁定 PMA,并终止分离会话tmux
。
我在这里使用的唯一原因tmux
是该sleep
实用程序不会中断我正在使用的当前会话,如上所述。
到目前为止我想到的
1 - 使用 Bash 背景代替 tmux:
我可以删除该tmux
部分并在后台调用该函数,&
但我不希望这样;我希望在运行该函数时不使用任何参数。
2 - 专用文件:
tdm
在分离会话中运行的一种方法tmux
是将子例程放入脚本中专用文件alias
,然后为该文件创建一个,并直接运行它:
1)创建专用文件:
$HOME/tdm.sh
2)添加一个alias
到"$HOME"/.bashrc
:
alias tdm="tmux new-session -d 'bash $HOME/tdm.sh'"
3)来源bashrc
:
source "$HOME"/.bashrc
4)使用别名:
tdm
但我不想将函数放在专用文件的脚本中;我想保留它包含其他功能的当前文件。
我的问题
如何在独立tmux
会话中从包含其他函数的文件内部运行该函数?
更新
Adisown
或nohup
解决方案可能会很好。只要我只在tdm
不带参数的情况下运行该函数,那么我不在乎它是否是用disown
,nohup
或完成的tmux
。
答案1
使用在;
tdm() {
chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/ && \
echo "chmod -R 000 \"$drt\"/phpmyadmin/" | at "now + 2h"
}
或者睡觉和
tdm() {
chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/ && \
nohup "sleep 2h; chmod -R 000 \"$drt\"/phpmyadmin/" &
}
或者屏幕
tdm() {
chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/ && \
screen -S tdm -d -m "sleep 2h; chmod -R 000 \"$drt\"/phpmyadmin/"
}
或者多路复用器
tdm() {
chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/ && \
tmux new -d -s tdm "sleep 2h; chmod -R 000 \"$drt\"/phpmyadmin/"
}
答案2
如果我明白你想要做什么,那么你使用的工具对于这项工作来说太强大了。不要仅为单个简单脚本生成专用会话,而是使用和tmux
从命令行运行该脚本。nohup
&
disown
nohup tdm DRT & disown
答案3
不确定这是否是您所要求的,但您可以直接传入要在分离会话中运行的命令的参数:
tmux new-session -n:myTest 'chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/;sleep 2h;chmod -R 000 "$drt"/phpmyadmin/'
答案4
在评论中,用户Rich提供了以下解决方案,但希望不要公开答案。
我明白他的意思是:
tdm() {
chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/
echo "chmod -R 000 $drt/phpmyadmin/" | at now + 2 hours
}