4

On Ubuntu 15.04 I have this file: /usr/local/bin/myscript (it's a script I made).

If I run this command under my account, it will do what I need it to do as a root user: sudo /usr/local/bin/myscript

I now want to make /usr/local/bin/myscript run on machine startup, but as a root user (as if I was running the sudo command but without having to type any password). How is this done on Ubuntu 15.04?

1
  • Do you want GUI password prompt for running script on starting machine or not?
    – Pandya
    Commented May 12, 2015 at 13:09

3 Answers 3

16

And now, the systemd answer.

You're using Ubuntu version 15. You have systemd. /etc/rc.local is at best a backwards compatibility mechanism in systemd. And as shown by the mess in the AskUbuntu question hyperlinked below, using it can go horribly wrong. So make a proper systemd service unit.

You are creating a local, non-system non-package, service unit, so the unit file will be in /etc/systemd/system/ which is where that type of units go. Let us call it /etc/systemd/system/myscript.service. It contains:

[Unit]
Description=user2580's script
Documentation=https://unix.stackexchange.com/questions/202698/

[Service]
Type=simple
ExecStart=/usr/local/bin/myscript

[Install]
WantedBy=multi-user.target

If your script forks "in order to dæmonize" then stop it from doing so. That's completely unnecessary.

  • Run systemctl preset myscript.service (as the superuser) to have it start automatically at bootstrap.
  • Run systemctl start myscript.service (as the superuser) to manually start it right now.
  • Run systemctl status myscript.service to see its status.

Note that this does not execute your script in a context where it will be able to talk to an X server. It could be run before an X server is even started up. But you don't mention any requirement for being an X client, nor for other complexities that bite novices like a HOME environment variable. And those are subjects for other questions, in any case. So I'll leave it at that.

Further reading

3
  • In case it needs to execute after other services (e.g., mounting a VM shared drive), one way is to set type=idle instead of type=simple. Commented Apr 22, 2016 at 23:40
  • I get Failed to preset unit: File caps2esc.service: No such file or directory when I try to run systemctl preset caps2esc.service. Am I missing something here? I'm on Ubuntu 17.04
    – kshenoy
    Commented May 18, 2017 at 15:14
  • Worked like a charm, thank you. Do you think that it's possible to run a specific command when the service stop is invoked?
    – funder7
    Commented Jun 21, 2022 at 12:03
2

You can simply add a line to call the script in /etc/rc.local. This file is the last of the init scripts to be run.

Just make sure that /etc/rc.local is executable and owned by root.

-1

You can use gksudo:-

NAME
       gksu - GTK+ frontend for su and sudo


DESCRIPTION           
       gksu is a frontend to su and gksudo is a frontend to sudo.  Their primary purpose is to run graphical commands
       that need root without the need to run an X terminal emulator and using su directly.
  • Open Startup Applications (System Settings > Startup Applications or gnome-session-properties).
  • Add new Entry with following command (gksudo myscript or gksudo /usr/local/bin/myscript):-

screenshiot

Click Add and this script will run when you startup/login to desktop.


Note:- Make sure gksu is installed in order to work with gksudo. (you can install it by sudo apt-get install gksu)


Another way is to use Askpass program which works with sudo -A:-

-A, --askpass
                 Normally, if sudo requires a password, it will read it from the user's terminal.  If the -A
                 (askpass) option is specified, a (possibly graphical) helper program is executed to read the user's
                 password and output the password to the standard output.  If the SUDO_ASKPASS environment variable
                 is set, it specifies the path to the helper program.  Otherwise, if sudo.conf(5) contains a line
                 specifying the askpass program, that value will be used.  For example:

                     # Path to askpass helper program
                     Path askpass /usr/X11R6/bin/ssh-askpass

Example I use zenity as askpass helper.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .