Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Cannot get cronjob to work - scripts work when entred manually into shell

    Scheduled Pinned Locked Moved pfSense Packages
    15 Posts 3 Posters 5.4k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • B
      bigbudd911
      last edited by

      Hi all. I had made a previous topic earlier on the forum, explaining what I am doing:
      http://forum.pfsense.org/index.php/topic,62598.0.html

      So I resolved my first issue. The command was working perfectly fine, however my installation of Pfsense was corrupted and I was unaware of this. Reinstalling Pfsense fixed everything - curl commands work great now.

      So basically, I have 3 scripts which are one line each, which I am trying to get working on a schedule in cron. I am only 14, and am not really sure where to get help with this. The commands that I enter into shell, do exactly as they are supposed to. The first two scripts simply pull my IP addresses while I am connected to my VPN. The third command, is to request the correct port that my VPN provider allows me to use (which changes randomly on their end)

      Contents of the scripts

      script1:
      #!/bin/sh
      ifconfig OPT1  | grep "inet " | cut -d\  -f2|tee /tmp/vpn_ip

      script2:
      #!/bin/sh
      curl ifconfig.me/ip|tee /tmp/vpn_external_ip

      script3:
      curl -o /etc/portforwardlist -d "user=USERNAME&pass=PASSWORD&client_id=$(cat ~/.pia_client_id)&local_ip=$(cat /tmp/vpn_ip)" https://www.privateinternetaccess.com/vpninfo/port_forward_assignment

      I have all of these scripts in /etc/
      In "cron" I have configured the first script to run every minute, the second to run every 2 minutes, and the 3rd to run every 3 minutes. In script 3, i added the -o argument to output to a file. This does work when entered manally into shell as well.

      Cron Setup:

      1 * * * * root /usr/bin/nice -n20 /etc/script1

      2 * * * * root /usr/bin/nice -n20 /etc/script2

      3 * * * * root /usr/bin/nice -n20 /etc/script3

      I then reboot my system for good measure, however, none of the files get outputed. The commands work when entered manually into shell. I am so unsure where to go from here, and I hate asking, becuase I know BSD is for pro's. But I am so new to BSD at my age, and I love the features of Pfsense. I appologies if I sound very noobish, but just can't seem to get this to work.

      Thanks for any assistance :)

      1 Reply Last reply Reply Quote 0
      • marcellocM
        marcelloc
        last edited by

        use full path binaries on your script that is running via cron.

        Treinamentos de Elite: http://sys-squad.com

        Help a community developer! ;D

        1 Reply Last reply Reply Quote 0
        • P
          phil.davis
          last edited by

          Use the full path to each executable - e.g.

          /sbin/ifconfig
          /usr/bin/grep
          

          and so on.

          You can find where the utilities live with the find command, e.g.:

          find / -name ifconfig
          /sbin/ifconfig
          

          As the Greek philosopher Isosceles used to say, "There are 3 sides to every triangle."
          If I helped you, then help someone else - buy someone a gift from the INF catalog http://secure.inf.org/gifts/usd/

          1 Reply Last reply Reply Quote 0
          • B
            bigbudd911
            last edited by

            Okay thanks for the quick reply guys!

            When you say the full path, are you refering to INSIDE the script? ex.

            #!/bin/sh
            /sbin/ifconfig OPT1  | grep "inet " | cut -d\  -f2|tee /tmp/vpn_ip

            instead of:

            #!/bin/sh
            ifconfig OPT1  | grep "inet " | cut -d\  -f2|tee /tmp/vpn_ip

            Thanks :D

            1 Reply Last reply Reply Quote 0
            • marcellocM
              marcelloc
              last edited by

              @bigbudd911:

              When you say the full path, are you refering to INSIDE the script? ex.

              Yes.  :)

              Treinamentos de Elite: http://sys-squad.com

              Help a community developer! ;D

              1 Reply Last reply Reply Quote 0
              • B
                bigbudd911
                last edited by

                Awesome. Thank you guys so much!

                1 Reply Last reply Reply Quote 0
                • B
                  bigbudd911
                  last edited by

                  Okay so I just got rid of the last two, to make testing easier.

                  I have used the following as my script1.sh  :

                  #!/bin/sh
                  /sbin/ifconfig ovpnc1  | /usr/bin/grep "inet " | /usr/bin/cut -d\  -f2|/usr/bin/tee /tmp/vpn_ip

                  i have tried also putting in a space after the | in between /usr/bin/tee - with no avail. Any idea gents?

                  Thank you very much!

                  1 Reply Last reply Reply Quote 0
                  • P
                    phil.davis
                    last edited by

                    This works for me in cron:

                    #!/bin/sh
                    /sbin/ifconfig ovpnc1 | /usr/bin/grep "inet" | /usr/bin/cut -f2 -d " " > /tmp/zzz.txt
                    

                    I guess the "tee" utility does not work so well in a background job? Or maybe the "-d" did something odd?

                    As the Greek philosopher Isosceles used to say, "There are 3 sides to every triangle."
                    If I helped you, then help someone else - buy someone a gift from the INF catalog http://secure.inf.org/gifts/usd/

                    1 Reply Last reply Reply Quote 0
                    • B
                      bigbudd911
                      last edited by

                      Thanks very much Phil. I was starting to think that
                      maybe it was having difficulty with one of the commands.
                      I will give that a shot tonight when I get home from school.
                      And just verifying, the command you enter in CRON is just
                      to start the script, correct?

                      ex.
                      1  *  *  *  *  root  /usr/bin/nice -n20 /etc/script1

                      OR do you put the actual shell command into the CRON entry?
                      (I dont think you do?). Sorry for all the newbish questions guys.

                      Once I get this working, I am going to make a tutorial for getting
                      this setup entirely, as we have a lot of inexperienced users over
                      at my VPN providers boards trying to accomplish the same thing
                      I am. Thanks for all the help guys, you are too kind!

                      1 Reply Last reply Reply Quote 0
                      • B
                        bigbudd911
                        last edited by

                        think i may have found the error. on the tee line, i believe i need a " . "

                        /usr/bin/tee ./tmp/vpn_ip

                        1 Reply Last reply Reply Quote 0
                        • marcellocM
                          marcelloc
                          last edited by

                          @bigbudd911:

                          /usr/bin/tee ./tmp/vpn_ip

                          why you need tee as it is running via cron?

                          did you tried to just redirect to your log file?

                          Treinamentos de Elite: http://sys-squad.com

                          Help a community developer! ;D

                          1 Reply Last reply Reply Quote 0
                          • B
                            bigbudd911
                            last edited by

                            So I tried editing the script to how you said:

                            #!/bin/sh
                            /sbin/ifconfig ovpnc1 | /usr/bin/grep "inet" | /usr/bin/cut -f2 -d " " > /tmp/zzz.txt

                            this is a script - directory is     /etc/script1.sh

                            the crontab entry looks as follows:

                            1   *   *   *   *   root   /usr/bin/nice -n2 /etc/script1.sh

                            and still a no go. this is driving me crazy haha. I am on pfsense 2.1 beta if that
                            makes a huge difference?

                            also, when i run the command in basic shell that Marcelloc posted, I end up getting two lines,
                            an ipv6 address and the ipv4 on line 2

                            1 Reply Last reply Reply Quote 0
                            • P
                              phil.davis
                              last edited by

                              I created /etc/script1.sh containing:

                              #!/bin/sh
                              /sbin/ifconfig ovpnc1 | /usr/bin/grep "inet" | /usr/bin/cut -f2 -d " " > /tmp/zzz.txt
                              

                              Then allow execute and everything on it (you can be more restrictive - this is for testing!):

                              chmod 777 /etc/script1.sh
                              

                              Then add to cron:

                              */1  	*  	*  	*  	*  	root  	/usr/bin/nice -n20 /etc/script1.sh
                              

                              "*/1" runs it every minute. Your setting of "1" in minutes will run it only at 1 minute past each hour.

                              On 2.1 there is IPv6. The OpenVPN gets an IPv6 "fe80:" address as well as IPv4. The output of /sbin/ifconfig contains lines for "inet" and "inet6", which both match your grep. The easy fix is to do

                              /usr/bin/grep -w "inet"
                              

                              then it will match the word "inet" and not the word "inet6".

                              As the Greek philosopher Isosceles used to say, "There are 3 sides to every triangle."
                              If I helped you, then help someone else - buy someone a gift from the INF catalog http://secure.inf.org/gifts/usd/

                              1 Reply Last reply Reply Quote 0
                              • B
                                bigbudd911
                                last edited by

                                Thank you so much Phil for being patient with me.
                                I know it sucks answering super noobish stuff. I really do
                                appreciate it. I was totally unaware of the */1 as well,
                                so that is a big help. :D Will try again tonight, or maybe if
                                I can find an old PC in my computer class, I will give it a try
                                shortly.

                                1 Reply Last reply Reply Quote 0
                                • B
                                  bigbudd911
                                  last edited by

                                  Alright!! Phil you were correct. That worked for the first script. The second one I managed to get working (somehow with the tee command). I ended up using:

                                  #!/bin/sh
                                  /usr/local/bin/curl ifconfig.me/ip|tee /tmp/vpn_external

                                  Now I am on to the final command, I have tinkered with it for about 2 hours, and I can get it to output a file, but the file only contains  {}  , usually it would have the port inside the brackets, ex. {45000}. Currently I am using the following command (the X's represent my username and password. If I enter the command into shell, it does work) I tried using the full path to both cat commands (and without) but no go:

                                  #!/bin/sh
                                  /usr/local/bin/curl -o /tmp/portforwardlist -d "user=XXXXX&pass=XXXXX&client_id=$(/bin/cat ~/.pia_config)&local_ip=$(/bin/cat /tmp/vpn_ip)" https://www.privateinternetaccess.com/vpninfo/port_forward_assignment

                                  ALMOST THERE

                                  1 Reply Last reply Reply Quote 0
                                  • First post
                                    Last post
                                  Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.