我想制作一个随计算机启动的 Python 3.4 脚本,以便永久选中它随计算机启动(编辑:永久选中意味着无法通过 xfce4-session-settings 禁用它)。(编辑:这应该会影响所有用户,甚至是未来的用户,但如果您在我说这句话之前回答了,我不会将其考虑在是否接受它。)脚本不需要结束,特别是。我不希望非特权用户能够取消选中它。我该怎么做呢?
目前,他们无法删除或编辑(甚至无法查看详细信息)该条目(谢天谢地),因为它是为所有用户(甚至是未来的用户)制作的。不过,他们似乎可以取消选中它。
myScript.desktop
(我通过添加文件为所有用户启用了它/etc/xdg/autostart
并为其提供了以下文本:
[Desktop Entry]
Type=Application
Name=NameOfMyScript
Exec=MyScript
Icon=system-run
X-GNOME-Autostart-enabled=True
)
该脚本允许更新基于 DNS 的 Web 过滤器的 IP 地址。它会定期检查连接是否丢失,以防路由器重置且 IP 地址发生变化。
我在 Xubuntu 14.04,64 位。
答案1
已编辑...
我认为您正在寻找“初始化脚本”解决方案。这里有一个简单的示例: https://unix.stackexchange.com/questions/6697/run-python-script-on-startup 还有一个: http://mobiarch.wordpress.com/2014/05/16/creating-an-init-script-in-ubuntu-14-04/
简而言之:你将脚本放入例如/usr/local/bin/my_script.py
(这不是必需的,你甚至可以从主目录运行它)
不要忘记:
sudo chmod +x /usr/local/bin/my_script.py
接下来,/etc/init.d
创建一个文件,例如my_script
包含以下内容:
#!/bin/sh
# /etc/init.d/my_script
# Description: Starts Python script my_script
# ————————————————–
#
### BEGIN INIT INFO
# Provides: my_script
# Required-Start: $network $local_fs $syslog
# Required-Stop: $local_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Start Python script my_script
### END INIT INFO
case $1 in
start)
echo -n "Starting my_script: "
/usr/bin/python /usr/local/bin/my_script.py &
;;
*)
echo "Usage: my_script start"
exit 1
esac
由于您希望此脚本在启动时启动,请运行以下命令:
sudo update-rc.d my_script defaults
我不确定我是否理解了您的意思:“我需要它在 Python 3.4 可用后启动脚本,因为它是一个 Python 脚本;”。请尝试这种方式,然后告诉我它是否启动。
再次编辑...无论如何,我正在考虑它...如果你的python脚本无法启动直到某些不确定的事件发生,也许你可以创建一个简单的bash脚本......类似于:
#!/bin/bash
STARTED=0
while [ $STARTED == 0 ]
do
./myscript.py && STARTED=1
sleep 1
done
答案2
我使用的另一种解决方案是基于Upstart
,这是一个非常强大的东西。也许你根本不需要它。
http://upstart.ubuntu.com/cookbook/
让我们在你的家中创建一个/home/your_user_name/scripts/my_script.conf
包含以下内容的文件:
# my_script.conf
description "here goes the description for my_script"
author "Peter Farkas @ InDaLine"
# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas#respawn
# When to start the service
start on runlevel [2345]
# When to stop the service
stop on runlevel [016]
# Automatically restart process if crashed
respawn
# Essentially lets upstart know the process will detach itself to the background
expect fork
# Run before process
pre-start script
setuid pep
chdir /home/your_user_name/scripts
end script
# Start the process
exec /usr/bin/python /home/your_user_name/scripts/my_script.py &
# Run after process start
post-start script
echo "my_script.py started"
end script
我们需要使其可执行:
sudo chomd +x /home/your_user_name/scripts/my_script.conf
之后将此 .conf 文件链接到/etc/init
目录:
sudo ln -s /home/your_user_name/scripts/my_script.conf /etc/init/my_script.conf
我记得在完成这些步骤后,我的脚本会在每次重启后启动,如果出现错误,脚本也会重新启动。我认为您可能不希望脚本永远运行,因此您不需要respawn
此文件中的这部分,但也许这正是您所需要的,所以我就留在那里了。(我的脚本旨在永远运行,如果它以某种方式停止,则需要立即重新启动)。
我仍然不确定你的句子“我需要它在 Python 3.4 可用后启动脚本,因为它是一个 Python 脚本;”但 Upstart 被称为“基于事件的”,所以你可能需要它来微调启动条件......
答案3
好吧,我找到了一个疯狂的解决方法。所以,我想分享一下。不过,我并不指望它会成为公认的答案(但它确实有效)。它可能很危险,也可能不危险。
即从 /usr/bin 复制 xfc4-session-settings 到所有我真正希望能够使用它的用户的 bin 文件夹中(例如 /home/sally/bin)。然后,从 /usr/bin 中删除它。然后,更改主 bin 目录的权限,以便未经授权的用户无法访问它们。因此,所有未来的用户都无法看到自动启动的内容。缺点是他们看不到任何内容(尽管他们看不到脚本是件好事)。保留一份副本,以便在您确实需要它时将其放回原处。重新启动(如果 bin 文件夹尚未存在)。
在尝试删除它之前,我尝试仅更改它的权限,但它仍然可以为不应该有权访问它的用户打开。