我有一个脚本,我想让它在后台持续运行,但我不知道从哪里启动它
如果我把它放进去.bashrc
,它将运行多次(每次登录一次)
这是一个无限循环,我希望在用户登录的情况下运行,但每个用户不能运行多次。
答案1
您的脚本应该检查是否只有一个实例。尝试这样的事情:
#!/bin/bash
mkdir ~/.lock_script || exit
trap "rmdir ~/.lock_script" EXIT
while true
do
# Do whatever the script does continuously, here....
#
done
该trap
命令负责在退出时进行清理,因此即使脚本被终止或终止,它也会进行清理。没有进程可以捕获(捕获)TERM 信号(信号 9),因此如果您kill -9
执行脚本,它不会自行清理。
就内核而言,mkdir 是一个原子操作。如果 mkdir 不成功(例如,如果目录已存在),则该命令将返回错误,这将导致命令的后半部分运行 - 例如退出。
您可以将该命令读作“mkdir or else exit” - 这里有更好的解释:http://initialprogramload.blogspot.com/2008/11/single-script-instance.html
我还建议您不要while true
以这种方式使用 - 如果可能的话,尝试想出另一种方式来做您想做的事情。
答案2
当bash(1)
作为登录 shell 运行时(即,当用户登录时),它将运行/etc/profile
、~/.bash_profile
、~/.bash_login
和 ,~/.profile
除非使用 调用--no-profile
。从那里开始你的脚本应该可以解决问题。
答案3
您可以再添加一项条件,如下所示:
加入.bashrc
export my_script_pid=myscript.${USER}
[[ ! -f $my_script_pid ]] && { touch $my_script_pid; echo run-script; } || echo "script already running"
然后在你的脚本中rm $my_script_pid
最后添加。
答案4
您可以运行该脚本并可以从以下命令获取日志:
nohup /path/to/your/script.sh > /dev/null 2>&1 &
它还会给你输出。